На главную страницу | Новости  |  Ссылки | Контакты

Spyphy Farnsworth
Квантовая реальность. Кибернетика. Искусственный интеллект


Введение в Python, часть 4. Классы (ООП)


Реализация объекно-ориентированного подхода в языке Python. Создание собственных классов

Классы в Python


Пример простейших классов и реализация наследования в Python:

 #code: Классы и наследование

class A1:
	def __init__(self, x):
		self.x = x
		print('A1:init')
	
	def foo(self):
		print('A1:foo')
		print(self.x)
		
class A2:
	def __init__(self, x):
		self.x = x
		print('A2:init')
	
	def foo(self):
		print('A2:foo')
		print(self.x)		
		
class B(A1, A2):
	foo = A2.foo	# explicit inheritance
	def __init__(self, x):
		self.x = x
		#A1.__init__(self, 2)
		#A2.__init__(self, 3)
		print('B:init')

ob = B(1)
ob.foo()

Вывод


B:init
A2:foo
1

Здесь дочерний класс B наследует два базовых класса A1 и A2.

Если из класса B убрать конструктор __init__, то по умолчанию будет вызван конструктор одного из базовых класса, а именно первого в списке наследования, т.е. A1. Это происходит потому, что если нет никакого конструктора, то генерируется конструктор по умолчанию?

Аналогично, когда мы вызываем функцию ob.foo(), то возникает вопрос, какого именного базового класса будет вызывана функция. (По умолчанию) это зависит от порядка следования базовых классов в списке наследования. Однако с помощью строки foo = A2.foo можно указать явно, функция какого класса нас интересует.

Перегрузка операторов


__call__


Экземпляры класса можно использовать вместо функций. Для этого достаточно перегрузить оператор __call__.

class A:
   def __call__(self, *pargs, **kargs):
      print('called: ', pargs, kargs)
      
a = A()
a(1, 2, 3, x=4, y=5)

out:

called:  (1, 2, 3) {'x': 4, 'y': 5}

Здесь pargs - кортеж, в который будую занесены обычне аргументы (без указания имени аргумента). А kargs - словарь, в который заносятся именованные аргументы.





galaxy