Python:通过实例访问类变量

Sna*_*akE 13 python scope specifications

在Python中,可以通过该类实例访问类变量:

>>> class A(object):
...     x = 4
...
>>> a = A()
>>> a.x
4
Run Code Online (Sandbox Code Playgroud)

很容易证明a.x真正解决了A.x,而不是在构造过程中复制到实例:

>>> A.x = 5
>>> a.x
5
Run Code Online (Sandbox Code Playgroud)

尽管这种行为众所周知并且被广泛使用,但我找不到任何涵盖它的权威文档.我在Python文档中找到的最接近的是关于类部分:

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        return 'hello world'
Run Code Online (Sandbox Code Playgroud)

[剪断]

...根据定义,作为函数对象的类的所有属性都定义其实例的相应方法.所以在我们的例子中,x.f是一个有效的方法引用,因为它MyClass.f是一个函数,但x.i不是,因为MyClass.i不是....

但是,这部分专门讨论了方法,因此它可能与一般情况无关.

我的问题是,这有记录吗?我可以依靠这种行为吗?

okm*_*okm 13

http://docs.python.org/reference/datamodel.html中引用ClassesClass instances部分

类具有由字典对象实现的命名空间.类属性引用被转换为此字典中的查找,例如,Cx被转换为C .__ dict __ ["x"](尽管对于新式类,特别是有许多钩子允许其他方法来定位属性)

通过调用类对象来创建类实例(参见上文).类实例具有作为字典实现的名称空间,该字典是搜索属性引用的第一个位置.当在那里找不到属性,并且实例的类具有该名称的属性时,搜索继续使用类属性.

一般来说,这种用法很好,除了提到的特殊情况"新风格的类,特别是有许多钩子允许其他方法定位属性".


Mik*_*ham 8

你经常这样做,不仅可以依赖这种行为.

想想方法.方法仅仅是已经成为类属性的函数.然后,您在实例上查找它.

>>> def foo(self, x):
...     print "foo:", self, x
... 
>>> class C(object):
...     method = foo # What a weird way to write this! But perhaps illustrative?
... 
>>> C().method("hello")
foo: <__main__.C object at 0xadad50> hello
Run Code Online (Sandbox Code Playgroud)

对于像函数这样的对象,这不是简单的查找,但是会self自动传递一些魔法.您可能已经使用了其他要存储为类属性的对象并在实例上查找; 属性就是一个例子(property如果你不熟悉它,请查看内置函数.)

正如okm所说,其工作方式在数据模型参考中有所描述(包括有关使方法和属性工作的魔法的更多信息的信息和链接)."数据模型"页面是迄今为止语言参考中最有用的部分; 它还包括几乎所有__foo__方法和名称的文档.