【问题标题】:Python data descriptor did not work as instance variable? [duplicate]Python 数据描述符不能用作实例变量? [复制]
【发布时间】:2016-04-29 07:37:55
【问题描述】:

正如官方demo描述的here,下面的代码会打印Retrieving var "x"

class RevealAccess(object):
    """A data descriptor that sets and returns values
       normally and prints a message logging their access.
    """

    def __init__(self, initval=None, name='var'):
        self.val = initval
        self.name = name

    def __get__(self, obj, objtype):
        print 'Retrieving', self.name
        return self.val

    def __set__(self, obj, val):
        print 'Updating', self.name
        self.val = val


class MyClass1(object):
    x = RevealAccess(10, 'var "x"')

MyClass1().x

但是如果x是一个实例变量,数据描述符机制将不起作用,下面的代码将不会打印任何东西。

class MyClass2(object):
    def __init__(self):
       self.x = RevealAccess(10, 'var "x"')

MyClass2().x

如果我按照here 的描述手动实现数据描述符机制,下面的代码将再次Retrieving var "x"

class MyClass3(object):
    def __init__(self):
       self.x = RevealAccess(10, 'var "x"')

    def __getattribute__(self, key):
        "Emulate type_getattro() in Objects/typeobject.c"
        v = object.__getattribute__(self, key)
        if hasattr(v, '__get__'):
            return v.__get__(None, self)
        return v

MyClass3().x

那么,默认数据描述符机制是否没有按照文档描述的方式实现?

我正在使用 python 2.7.10。

【问题讨论】:

    标签: python python-2.7 descriptor


    【解决方案1】:

    这里的描述方法是错误的。 Python data model 的描述正确:

    以下方法 [__get____set____delete__] 仅适用于类的实例 包含方法(所谓的描述符类)出现在 所有者类(描述符必须在所有者的类中 字典或在其父母之一的类字典中)。

    描述符必须是类属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多