You are currently viewing Наследование в Python

Наследование в Python

Наследование — это способность одного класса выводить или наследовать свойства из другого класса. Преимущества наследования заключаются в следующем:

  1. Он хорошо отражает отношения в реальном мире.
  2. Это обеспечивает возможность повторного использования кода. Нам не нужно снова и снова писать один и тот же код. Кроме того, это позволяет нам добавлять дополнительные функции в класс, не изменяя его.
  3. Он носит транзитивный характер, что означает, что если класс B наследуется от другого класса A, то все подклассы B автоматически наследуются от класса A.

Ниже приведен простой пример наследования в Python

# A Python program to demonstrate inheritance

# Base or Super class. Note object in bracket.
# (Generally, object is made ancestor of all classes)
# In Python 3.x "class Person" is
# equivalent to "class Person(object)"
class Person(object):
	
	# Constructor
	def __init__(self, name):
		self.name = name

	# To get name
	def getName(self):
		return self.name

	# To check if this person is an employee
	def isEmployee(self):
		return False


# Inherited or Subclass (Note Person in bracket)
class Employee(Person):

	# Here we return true
	def isEmployee(self):
		return True

# Driver code
emp = Person("Geek1") # An Object of Person
print(emp.getName(), emp.isEmployee())

emp = Employee("Geek2") # An Object of Employee
print(emp.getName(), emp.isEmployee())

Выход:

Geek1 False
Geek2 True

Что такое класс объектов?

Нравится Класс объектов Java, в Python (начиная с версии 3.x) объект является корнем всех классов.
В Python 3.x» тест класса(объект)” и “тест класса” одинаковы.
В Python 2.x “тест класса(объект)” создает класс с объектом в качестве родителя (называемый новым классом стиля), а “тест класса” создает класс старого стиля (без родительского объекта). 

Подкласс (вызов конструктора родительского класса) 
Дочерний класс должен определить, какой класс является его родительским классом. Это можно сделать, упомянув имя родительского класса в определении дочернего класса.
Например: класс имя подкласса (имя суперкласса):

# Python code to demonstrate how parent constructors
# are called.

# parent class
class Person( object ):	

		# __init__ is known as the constructor		
		def __init__(self, name, idnumber):
				self.name = name
				self.idnumber = idnumber
		def display(self):
				print(self.name)
				print(self.idnumber)

# child class
class Employee( Person ):		
		def __init__(self, name, idnumber, salary, post):
				self.salary = salary
				self.post = post

				# invoking the __init__ of the parent class
				Person.__init__(self, name, idnumber)

				
# creation of an object variable or an instance
a = Employee('Rahul', 886012, 200000, "Intern")	

# calling a function of the class Person using its instance
a.display()

Выход:

Rahul 886012 

‘a’ — это экземпляр, созданный для человека класса. Он вызывает __init__() указанного класса. Вы можете увидеть » объект’, написанный в объявлении класса Person. В Python каждый класс наследуется от встроенного базового класса под названием » объект’. Конструктор, т. е. функция ‘__init__’ класса, вызывается, когда мы создаем объектную переменную или экземпляр класса.

Переменные, определенные в __init__ (), называются переменными экземпляра или объектами. Следовательно, » имя «и ‘идентификационный номер» являются объектами класса Person. Аналогично, «зарплата» и «должность» являются объектами классного работника. Поскольку сотрудник класса наследует от сотрудника класса, » имя » и «идентификационный номер» также являются объектами сотрудника класса.
Если вы забудете вызвать __init__() родительского класса, то его переменные экземпляра будут недоступны дочернему классу.

Следующий код выдает ошибку по той же причине.

# Python program to demonstrate error if we
# forget to invoke __init__() of the parent.

class A:
	def __init__(self, n = 'Rahul'):
			self.name = n
class B(A):
	def __init__(self, roll):
			self.roll = roll

object = B(23)
print (object.name)

Выход:

Traceback (most recent call last):
  File "/home/de4570cca20263ac2c4149f435dba22c.py", line 12, in 
    print (object.name)
AttributeError: 'B' object has no attribute 'name'

Различные формы наследования:

1. Одиночное наследование: Когда дочерний класс наследуется только от одного родительского класса, он называется одиночным наследованием. Мы видели пример выше.
2. Множественное наследование: Когда дочерний класс наследуется от нескольких родительских классов, это называется множественным наследованием.
В отличие от Java и, как и C++, Python поддерживает множественное наследование. Мы указываем все родительские классы в виде списка, разделенного запятыми, в скобках.

# Python example to show the working of multiple
# inheritance
class Base1(object):
	def __init__(self):
		self.str1 = "Geek1"
		print("Base1")

class Base2(object):
	def __init__(self):
		self.str2 = "Geek2"		
		print("Base2")

class Derived(Base1, Base2):
	def __init__(self):
		
		# Calling constructors of Base1
		# and Base2 classes
		Base1.__init__(self)
		Base2.__init__(self)
		print("Derived")
		
	def printStrs(self):
		print(self.str1, self.str2)
		

ob = Derived()
ob.printStrs()

Выход:

Base1
Base2
Derived
Geek1 Geek2

3. Многоуровневое наследование: Когда у нас будут отношения между ребенком и внуком.

# A Python program to demonstrate inheritance

# Base or Super class. Note object in bracket.
# (Generally, object is made ancestor of all classes)
# In Python 3.x "class Person" is
# equivalent to "class Person(object)"
class Base(object):
	
	# Constructor
	def __init__(self, name):
		self.name = name

	# To get name
	def getName(self):
		return self.name


# Inherited or Sub class (Note Person in bracket)
class Child(Base):
	
	# Constructor
	def __init__(self, name, age):
		Base.__init__(self, name)
		self.age = age

	# To get name
	def getAge(self):
		return self.age

# Inherited or Sub class (Note Person in bracket)
class GrandChild(Child):
	
	# Constructor
	def __init__(self, name, age, address):
		Child.__init__(self, name, age)
		self.address = address

	# To get address
	def getAddress(self):
		return self.address		

# Driver code
g = GrandChild("Geek1", 23, "Noida")
print(g.getName(), g.getAge(), g.getAddress())

Выход:

4. Иерархическое наследование Более одного производного класса создается из одной базы.

5. Гибридное наследование: Эта форма объединяет более одной формы наследования. По сути, это смесь более чем одного типа наследования.

Частные члены родительского класса 
Мы не всегда хотим, чтобы переменные экземпляра родительского класса наследовались дочерним классом, т. е. Мы можем сделать некоторые переменные экземпляра родительского класса закрытыми, которые не будут доступны дочернему классу.
Мы можем создать переменную экземпляра, добавив двойное подчеркивание перед ее именем. Например:

# Python program to demonstrate private members
# of the parent class
class C(object):
	def __init__(self):
			self.c = 21

			# d is private instance variable
			self.__d = 42	
class D(C):
	def __init__(self):
			self.e = 84
			C.__init__(self)
object1 = D()

# produces an error as d is private instance variable
print(object1.d)					

Выход:

File "/home/993bb61c3e76cda5bb67bd9ea05956a1.py", line 16, in 
  print (object1.d)                     
AttributeError: type object 'D' has no attribute 'd'

Поскольку эти подчеркивания делают » d «закрытым, он недоступен для дочернего класса «D», и, следовательно, ошибка.