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文档中找到的最接近的是关于类的部分:
Run Code Online (Sandbox Code Playgroud)class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world'[剪断]
...根据定义,作为函数对象的类的所有属性都定义其实例的相应方法.所以在我们的例子中,
x.f是一个有效的方法引用,因为它MyClass.f是一个函数,但x.i不是,因为MyClass.i不是....
但是,这部分专门讨论了方法,因此它可能与一般情况无关.
我的问题是,这有记录吗?我可以依靠这种行为吗?
okm*_*okm 13
在http://docs.python.org/reference/datamodel.html中引用Classes和Class instances部分
类具有由字典对象实现的命名空间.类属性引用被转换为此字典中的查找,例如,Cx被转换为C .__ dict __ ["x"](尽管对于新式类,特别是有许多钩子允许其他方法来定位属性)
通过调用类对象来创建类实例(参见上文).类实例具有作为字典实现的名称空间,该字典是搜索属性引用的第一个位置.当在那里找不到属性,并且实例的类具有该名称的属性时,搜索继续使用类属性.
一般来说,这种用法很好,除了提到的特殊情况"新风格的类,特别是有许多钩子允许其他方法定位属性".
你经常这样做,不仅可以依赖这种行为.
想想方法.方法仅仅是已经成为类属性的函数.然后,您在实例上查找它.
>>> 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__方法和名称的文档.
| 归档时间: |
|
| 查看次数: |
7000 次 |
| 最近记录: |