Bazen metinler, ayrıntılardan ziyade fikrin lezzeti için daha fazla okunmalıdır. Bu, o davalardan biri.
Olarak bağlanmış, sayfa , Örnek 2.5, 2.6 ve 2.7 olmalıdır tüm kullanım için tek bir yöntem olup, do_your_stuff
. (Yani, do_something
olarak değiştirilmelidir do_your_stuff
.)
Ayrıca Ned Deily'nin de belirttiği gibi , A.do_your_stuff
bir sınıf metodu olmalıdır.
class A(object):
@classmethod
def do_your_stuff(cls):
print 'This is A'
class B(A):
@classmethod
def do_your_stuff(cls):
super(B, cls).do_your_stuff()
B.do_your_stuff()
super(B, cls).do_your_stuff
ilişkili bir yöntem
döndürür (bkz. dipnot 2 ). Yana cls
ikinci bağımsız değişken olarak kabul edildi super()
, öyle cls
döndürülür yönteme bağlı olur. Başka bir deyişle, A sınıfının cls
yöntemine ilk argüman olarak aktarılır do_your_stuff()
.
Yinelemek için: super(B, cls).do_your_stuff()
nedenleri A
Var do_your_stuff
olan yöntem çağrılacak cls
ilk argümanı olarak. Bunun işe yaraması için, A
'nin
do_your_stuff
bir sınıf yöntemi olması gerekir. Bağlantı verilen sayfa bundan bahsetmiyor, ancak durum kesinlikle bu.
PS. do_something = classmethod(do_something)
sınıf yöntemi yapmanın eski yoludur. Yeni (er) yol, @classmethod dekoratörünü kullanmaktır.
İle super(B, cls)
değiştirilemeyeceğini unutmayın super(cls, cls)
. Bunu yapmak sonsuz döngülere yol açabilir. Örneğin,
class A(object):
@classmethod
def do_your_stuff(cls):
print('This is A')
class B(A):
@classmethod
def do_your_stuff(cls):
print('This is B')
super(cls, cls).do_your_stuff()
class C(B):
@classmethod
def do_your_stuff(cls):
print('This is C')
super(cls, cls).do_your_stuff()
C.do_your_stuff()
yükselecek RuntimeError: maximum recursion depth exceeded while calling a Python object
.
Eğer cls
bir C
sonra super(cls, cls)
aramalar C.mro()
sonra gelen sınıf için C
.
In [161]: C.mro()
Out[161]: [__main__.C, __main__.B, __main__.A, object]
O sınıf olduğundan B
zaman cls
olduğu C
, super(cls, cls).do_your_stuff()
her zaman çağırır B.do_your_stuff
. Yana super(cls, cls).do_your_stuff()
içeride denir B.do_your_stuff
, aradığınız sona B.do_your_stuff
sonsuz döngüye.
Python3'te, 0-argüman formusuper
eklendi, böylece super(B, cls)
ile değiştirilebilir super()
ve Python3 bağlamdan super()
, tanımında class B
eşdeğer olması gerektiğini anlayacaktır super(B, cls)
.
Ancak hiçbir koşulda super(cls, cls)
(veya benzer nedenlerle super(type(self), self)
) asla doğru değildir.