При создании простой иерархии объектов в Python я хотел бы иметь возможность вызывать методы родительского класса из производного класса. В Perl и Java есть ключевое слово для этого ( super
). В Perl я мог бы сделать это:
package Foo;
sub frotz {
return "Bamf";
}
package Bar;
@ISA = qw(Foo);
sub frotz {
my $str = SUPER::frotz();
return uc($str);
}
В Python кажется, что я должен явно назвать родительский класс от дочернего. В приведенном выше примере мне нужно сделать что-то вроде Foo::frotz()
.
Это кажется неправильным, поскольку такое поведение затрудняет создание глубоких иерархий. Если дети должны знать, какой класс определяет унаследованный метод, то создается всякая информационная боль.
Это фактическое ограничение в Python, пробел в моем понимании или оба?
python
inheritance
class
object
jjohn
источник
источник
Ответы:
Да, но только с классами нового стиля . Используйте
super()
функцию:Для python <3 используйте:
источник
super(Foo, self)
для Python 2.x правильный? В Python 3.xsuper()
предпочтительным является правильный?Python также имеет супер :
super(type[, object-or-type])
Пример:
источник
будет хорошо, независимо от того, определил ли родительский класс
frotz
себя или унаследовал его.super
нужен только для правильной поддержки множественного наследования (и тогда он работает только в том случае, если каждый класс использует его правильно). В общем,AnyClass.whatever
собирается искатьwhatever
вAnyClass
предках России, еслиAnyClass
не определит / не переопределит его, и это верно для «дочернего класса, вызывающего метод родителя», как и для любого другого случая!источник
parent
, он входит в сферу действия всего класса, не так ли?Python 3 имеет другой и более простой синтаксис для вызова родительского метода.
Если
Foo
класс наследует отBar
, то изBar.__init__
можно вызвать изFoo
черезsuper().__init__()
:источник
Во многих ответах объясняется, как вызвать метод из родительского объекта, который был переопределен в дочернем элементе.
Однако
может также просто означать:
Вы можете вызывать методы, унаследованные от родительского класса, так же, как если бы они были методами дочернего класса, если они не были перезаписаны.
например, в питоне 3:
да, это может быть довольно очевидно, но я чувствую, что, не указывая на это, люди могут покинуть эту ветку с впечатлением, что вы должны перепрыгивать через нелепые обручи только для доступа к унаследованным методам в python. Тем более, что этот вопрос высоко ценится в поисках «как получить доступ к методу родительского класса в Python», а OP написан с точки зрения кого-то, кто плохо знаком с Python.
Я обнаружил: https://docs.python.org/3/tutorial/classes.html#inheritance полезный для понимания того, как вы получаете доступ к унаследованным методам.
источник
self.string
ничего не сделает. В классе C вы все равно можете позвонитьB().bar(string)
Вот пример использования super () :
источник
В Python тоже есть супер (). Это немного шатко из-за старых и новых стилей Python, но довольно часто используется, например, в конструкторах:
источник
Я бы порекомендовал использовать
CLASS.__bases__
что-то вроде этогоисточник
Если вы не знаете, сколько аргументов вы можете получить, и хотите передать их все также ребенку:
(From: Python - Самый чистый способ переопределить __init__, где необязательный kwarg должен использоваться после вызова super ()? )
источник
В python также есть супер ().
Пример того, как метод суперкласса вызывается из метода подкласса
Этот пример похож на тот, который описан выше. Однако есть одно отличие, что у super нет аргументов, переданных ему. Этот код выполняется в версии Python 3.4.
источник
В этом примере
cafec_param
это базовый класс (родительский класс) иabc
дочерний класс.abc
вызываетAWC
метод в базовом классе.Вывод
источник
В Python 2 мне не очень повезло с super (). Я использовал ответ от jimifiki в этой теме, как ссылаться на родительский метод в python?, Затем я добавил к этому свой небольшой поворот, который, я думаю, является улучшением юзабилити (особенно если у вас длинные имена классов).
Определите базовый класс в одном модуле:
Затем импортируйте класс в другие модули
as parent
:источник
class A(object):
вместоclass A():
Тогда супер () будет работатьисточник
источник
Это более абстрактный метод:
источник
super(self.__class__, self).baz(arg)
.