【问题标题】:Difference between using __init__ and setting a class variable使用 __init__ 和设置类变量之间的区别
【发布时间】:2009-06-19 16:54:44
【问题描述】:

我正在尝试学习描述符,但我对对象的行为感到困惑 - 在下面的两个示例中,据我了解 __init__ 它们应该工作相同。谁能解开我的疑惑,或者给我指出一个可以解释这一点的资源?

import math
class poweroftwo(object):
    """any time this is set with an int, turns it's value to a tuple of the int
    and the int^2"""
    def __init__(self, value=None, name="var"):
        self.val = (value, math.pow(value, 2))
        self.name = name

    def __set__(self, obj, val):
        print "SET"
        self.val = (val, math.pow(val, 2))
    def __get__(self, obj, objecttype):
        print "GET"
        return self.val

class powoftwotest(object):
    def __init__(self, value):
        self.x = poweroftwo(value)

class powoftwotest_two(object):
    x = poweroftwo(10)


>>> a = powoftwotest_two()
>>> b = powoftwotest(10)
>>> a.x == b.x
>>> GET
>>> False #Why not true? shouldn't both a.x and b.x be instances of poweroftwo with the same values?

【问题讨论】:

  • 您可能希望在输出中包含 type(a.x) 和 type(b.x)。

标签: python descriptor


【解决方案1】:

首先,请用LeadingUpperCaseNames 命名所有类。

>>> a.x
GET
(10, 100.0)
>>> b.x
<__main__.poweroftwo object at 0x00C57D10>
>>> type(a.x)
GET
<type 'tuple'>
>>> type(b.x)
<class '__main__.poweroftwo'>

a.x 是实例级访问,支持描述符。这就是 3.4.2.2 节中“(一个所谓的描述符类)出现在另一个新式类的类字典中”的意思。类字典必须由实例访问才能使用__get____set__ 方法。

b.x 是类级访问,不支持描述符。

【讨论】:

  • 如果描述符在元类上,可以支持类级访问。
  • @EthanFurman:虽然完全正确,但远远超出了这个问题。和。我的答案没有太大变化,是吗?
  • 只有最后一行。 (这就是为什么我仍然投赞成票。):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多