我只是在学习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变量相同?难道不只是将elementNone覆盖为传递到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,那么fFoo都是相同的。但是如果我们更改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.foovarFoo.foovar指的是同一对象,因此,当您更改对象时,更改将沿层次结构传播:
>>> Foo.foovar = [1]
>>> f = Foo(5)
>>> f.foovar[0] = 99
>>> Foo.foovar
[99]

关于python - Python类成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12409714/

10-09 15:44