类字段是在python中继承的吗?
//更新:类字段是在python中继承的吗?,python,Python,//更新: class A: a = 3 def f(self): print self.a class C(A): def __init__(self): self.a = 4 >>> a=A() >>> a.f() 3 >>> c = C() >>> a.f() 3 >>> c.f() 4 如何解释结果 似乎C和A有一个不同的A副本。在C++
class A:
a = 3
def f(self):
print self.a
class C(A):
def __init__(self):
self.a = 4
>>> a=A()
>>> a.f()
3
>>> c = C()
>>> a.f()
3
>>> c.f()
4
如何解释结果
似乎C和A有一个不同的A副本。在C++中,静态成员将被与它派生类共享。 在Python中有一个类属性和一个实例属性
>>> C.a = 5
>>> A.a
3
>>> c.a
4
似乎C和A有一个不同的A副本
对。如果您来自Java,将类A视为“静态”字段,将类C视为“实例”字段是很有帮助的。Martin Konecny的观点基本正确。有类级属性(类似于静态成员)和实例级属性。所有实例都共享它们的类属性(但不是它们的实例属性),并且它们可以动态更改。有些令人困惑的是,您可以使用点表示法从实例中获取类属性,除非使用相同的名称定义实例属性。也许这些例子是说明性的:
>>A类:
... a=3
... def f(自我):
... 打印自我
...
>>>C(A)类:
... 定义初始化(自):
... self.a=4
...
>>>a=a()
>>>
>>>A.A#类级属性
3.
>>>a.a#未重新定义,仍为类级属性
3.
>>>A.A=5#重新定义类级别属性
>>>A.A#验证值是否已更改
5.
>>>a.a#验证实例是否反映了更改
5.
>>>a.a=6#创建实例级属性
>>>A.A#验证类级别属性是否保持不变
5.
>>>a.a#验证实例级属性是否符合定义
6.
>>>a.uuu类uuu.a#您仍然可以获得类级属性
5.
>>>
>>>c1=C()
>>>c2=C()
>>>当我们做a.a=5时,情况发生了变化,因为它是遗传的
5.
>>>c1.a#但实例级attr仍然存在
4.
>>>c2.a#对于这两种情况
4.
>>>c1.a=7#但如果我们改变一个实例
>>>c1.a#(确认已设置)
7.
>>>c2.a#另一个实例未更改
4.
但是我可以通过类名C.a
访问一个类。查看我的更新。当您说C.a=5
时,您创建了第三个属性。您为类C创建了一个“静态”字段,它在基类a
中隐藏a
?代码中有一个小错误。最后一行c.a
应打印4。再试一次。如果执行C.a
操作,您将打印静态属性,如果执行C.a
操作,您将获得实例属性。@goodmami实际上,这是因为\uuuu getattr\uuuuu
和\uu setattr\uuuuu
的不对称行为C.a
调用\uuuu getattr\uuuu
从a->C->a递归搜索a
,而C.a=5
调用\uu setattr\uuuuu
调用\uuu setattr\uuuuuuu
不执行相同的搜索,只需创建一个新的a
,它隐藏a的class属性。我只是转达了别人的解释,希望对别人有帮助。如果我遗漏了什么,请更正。我认为这更能说明问题。见我对马丁·科内克尼回答的评论。
class A:
a = 3 # here you are creating a class attribute
def f(self):
print self.a
class C(A):
def __init__(self):
self.a = 4 #here you are creating an instance attribute