Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类字段是在python中继承的吗?_Python - Fatal编程技术网

类字段是在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