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_somethingolarak değiştirilmelidir do_your_stuff.)
Ayrıca Ned Deily'nin de belirttiği gibi , A.do_your_stuffbir 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_stuffilişkili bir yöntem
döndürür (bkz. dipnot 2 ). Yana clsikinci bağımsız değişken olarak kabul edildi super(), öyle clsdöndürülür yönteme bağlı olur. Başka bir deyişle, A sınıfının clsyöntemine ilk argüman olarak aktarılır do_your_stuff().
Yinelemek için: super(B, cls).do_your_stuff()nedenleri AVar do_your_stuffolan yöntem çağrılacak clsilk argümanı olarak. Bunun işe yaraması için, A'nin
do_your_stuffbir 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 clsbir Csonra 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 Bzaman clsolduğ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_stuffsonsuz 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 Beş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.