【问题标题】:Accessing class variables via instance通过实例访问类变量
【发布时间】:2012-04-25 10:06:03
【问题描述】:

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

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

很容易证明a.x确实解析为A.x,而不是在构造过程中复制到实例:

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

尽管这种行为是well known 并被广泛使用,但我找不到任何涵盖它的权威文档。我在 Python 文档中能找到的最接近的是 section on classes:

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

[剪辑]

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

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

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

【问题讨论】:

    标签: python scope specifications


    【解决方案1】:

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

    一个类有一个由字典对象实现的命名空间。班级 属性引用被翻译成这本词典中的查找, 例如,C.x 被翻译成 C.__dict__["x"] (尽管特别是对于新式类,有许多钩子允许其他定位属性的方法)

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

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

    【讨论】:

      【解决方案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 所说,data model reference 中描述了这种工作方式(包括有关使方法和属性工作的魔法的信息和指向更多信息的链接)。数据模型页面是迄今为止语言参考中最有用的部分;它还包括几乎所有 __foo__ 方法和名称的文档。

      【讨论】:

      • +1 表示方法的新视图,但我过去编写的大部分代码现在看起来更奇怪、更脆弱;谢谢你:-/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2011-02-21
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多