我只是在学习Python,而且我来自C语言,所以如果我之间有任何混淆/混淆,请告诉我。
假设我有以下类(class):
class Node(object):
def __init__(self, element):
self.element = element
self.left = self.right = None
@classmethod
def tree(cls, element, left, right):
node = cls(element)
node.left = left
node.right = right
return node
这是一个名为
Node
的类,该类使构造函数重载,从而能够在需要时处理不同的参数。仅在
self.element
中定义__init__
(如上所示)与执行以下操作有什么区别:class Node(object):
element, left, right = None
def __init__(self, element):
self.element = element
self.left = self.right = None
self.element
中的__init__
是否与定义的类的element
变量相同?难道不只是将element
从None
覆盖为传递到element
的__init__
值吗? 最佳答案
一个是类属性,而另一个是实例属性。它们是不同的,但是它们之间的紧密联系使它们有时看起来相同。
它与python查找属性的方式有关。有一个层次结构。在简单的情况下,可能看起来像这样:
instance -> Subclass -> Superclass -> object (built-in type)
当您像这样在
instance
上查找属性时...`instance.val`
...实际上发生的是,首先,Python在实例本身中查找
val
。然后,如果找不到val
,它将查找其类Subclass
。然后,如果未在其中找到val
,它将查找Subclass
的父对象Superclass
。这意味着当您这样做时...>>> class Foo():
foovar = 10
def __init__(self, val):
self.selfvar = val
...所有
Foo
实例都共享foovar
,但具有各自不同的selfvar
。这是一个简单的具体示例:>>> f = Foo(5)
>>> f.foovar
10
>>> Foo.foovar
10
如果我们不触摸
foovar
,那么f
和Foo
都是相同的。但是如果我们更改f.foovar
...>>> f.foovar = 5
>>> f.foovar
5
>>> Foo.foovar
10
...我们添加了一个有效屏蔽
Foo.foovar
值的实例属性。现在,如果我们直接更改Foo.foovar
,则不会影响我们的foo
实例:>>> Foo.foovar = 7
>>> f.foovar
5
但这确实会影响新的
foo
实例:>>> Foo(5).foovar
7
还请记住,可变对象增加了另一层间接寻址(正如mgilson提醒我的那样)。在这里,
f.foovar
与Foo.foovar
指的是同一对象,因此,当您更改对象时,更改将沿层次结构传播:>>> Foo.foovar = [1]
>>> f = Foo(5)
>>> f.foovar[0] = 99
>>> Foo.foovar
[99]
关于python - Python类成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12409714/