在類定義期間,沒有任何繼承的屬性可用:
>>> class Super(object):
class_attribute = None
def instance_method(self):
pass
>>> class Sub(Super):
foo = class_attribute
Traceback (most recent call last):
File "", line 1, in
class Sub(Super):
File "", line 2, in Sub
foo = class_attribute
NameError: name 'class_attribute' is not defined
>>> class Sub(Super):
foo = instance_method
Traceback (most recent call last):
File "", line 1, in
class Sub(Super):
File "", line 2, in Sub
foo = instance_method
NameError: name 'instance_method' is not defined
您甚至無法使用super訪問它們,因為子類的名稱未在定義塊*中定義:
>>> class Sub(Super):
foo = super(Sub).instance_method
Traceback (most recent call last):
File "", line 1, in
class Sub(Super):
File "", line 2, in Sub
foo = super(Sub).instance_method
NameError: name 'Sub' is not defined
在定義時訪問繼承屬性的唯一方法是使用超類的名稱顯式地這樣做:
>>> class Sub(Super):
foo = Super.class_attribute
>>> Sub.foo is Super.class_attribute
True
或者,您可以在類或實例方法中訪問它們,但是您需要使用類的適當前綴(常規cls)或實例(常規自身)參數.
*對于任何想“啊,但在3.x你不需要超級論證”的人:
>>> class Sub(Super):
foo = super().instance_method
Traceback (most recent call last):
File "", line 1, in
class Sub(Super):
File "", line 2, in Sub
foo = super().instance_method
RuntimeError: super(): no arguments
這在實例/類方法中是唯一的!