Python的:通过实例访问类变量(Python: access class variables v

2019-06-23 23:11发布

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

>>> class A(object):
...     x = 4
...
>>> a = A()
>>> a.x
4

这很容易证明ax真的决心Ax ,施工期间不会被复制到一个实例:

>>> A.x = 5
>>> a.x
5

尽管这种行为是众所周知的和广泛使用,我找不到任何明确的文件覆盖它。 我能找到Python文档最近的是上类部分 :

 class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world' 

[剪断]

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

然而,这部分专门谈到了方法,所以它可能是一般情况下不相关的。

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

Answer 1:

参考文献的ClassesClass instances的部分http://docs.python.org/reference/datamodel.html

一个类有一个用字典对象实现的名字空间。 类属性的引用被转换到查找这个字典,例如,CX被转换到C .__字典__ [“X”](虽然对于新式的类特别有许多钩,其允许用于定位的属性的其他装置)

一个类的实例是通过调用一类对象(见上文)创建。 一个类的实例有一个用字典是在哪个属性引用搜索的第一个地方实现的名字空间。 如果没有找到一个属性存在,并且该实例的类有这个名字的属性,则搜索类属性继续。

一般来说,这种用法是罚款,除非提到的特殊情况下的“新样式类特别是有一些挂钩,允许定位属性的其他手段”。



Answer 2:

您不仅可以依赖于这种行为,你不断做。

想想方法。 一种方法,仅仅是已经取得一类属性的功能。 然后你看看它的实例。

>>> 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

在类似功能的对象的情况下,这不是一个普通的查找,但会发生一些魔术通过self自动。 你可能已经使用了旨在存储为类的属性,抬头对实例中的其他对象; 属性是一个例子(检查出的property内置如果你不熟悉它。)

作为OKM指出,这种工作方式在描述数据模型参考 (包括有关信息和链接有关,使得方法和属性的工作魔术更多信息)。 数据模型页面是迄今为止语言参考的最有用的部分; 它也包括除其他事项外文档有关的几乎所有__foo__方法和名称。



文章来源: Python: access class variables via instance