gpt4 book ai didi

python - 从子类中的父类访问属性

转载 作者:行者123 更新时间:2023-11-28 19:54:50 25 4
gpt4 key购买 nike

当我像这样通过子类访问父类的属性时,一切正常:

class A():
a=1
b=2

class B(A):
c=3

d=B.a+B.b+B.c
print d

但是如果我尝试像这样访问子类中的父类的属性,它就不起作用:

class A():
a=1
b=2

class B(A):
c=3
d=a+b+c
print d

我收到错误:name 'a' is not defined

假设我有很多方程式,例如 d=a+b+c(但更复杂),我无法编辑它们 - 我必须在 B 类“a”中调用“a”,而不是“self”。 a”或“something.a”。但我可以在方程式之前做 A.a=a。但这不是手动重新加载所有变量的最聪明的方法。我想使用继承绕过它。有可能还是我应该手动完成所有操作?或者它可能是这段代码中的第三条路线?

最佳答案

在类定义期间,继承的属性均不可用:

>>> class Super(object):
class_attribute = None
def instance_method(self):
pass


>>> class Sub(Super):
foo = class_attribute



Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
class Sub(Super):
File "<pyshell#7>", 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 "<pyshell#9>", line 1, in <module>
class Sub(Super):
File "<pyshell#9>", line 2, in Sub
foo = instance_method
NameError: name 'instance_method' is not defined

您甚至不能使用 super 访问它们,因为子类的名称未在定义 block 中定义*:

>>> class Sub(Super):
foo = super(Sub).instance_method



Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class Sub(Super):
File "<pyshell#11>", line 2, in Sub
foo = super(Sub).instance_method
NameError: name 'Sub' is not defined

在定义时访问继承属性的唯一方法是使用父类(super class)的名称显式地这样做:

>>> class Sub(Super):
foo = Super.class_attribute


>>> Sub.foo is Super.class_attribute
True

或者,您可以在类或实例方法中访问它们,但是您需要使用类的适当前缀(通常是 cls)或实例(通常是 self)参数。


* 对于那些想“啊,但是在 3.x 中你不需要super”的参数的人:

>>> class Sub(Super):
foo = super().instance_method


Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
class Sub(Super):
File "<pyshell#6>", line 2, in Sub
foo = super().instance_method
RuntimeError: super(): no arguments

只有在实例/类方法内部才是正确的!

关于python - 从子类中的父类访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33346389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com