代码之家  ›  专栏  ›  技术社区  ›  intuited

通过子类化“type”类实现类描述符

  •  1
  • intuited  · 技术社区  · 14 年前

    我想要一些数据描述符作为类的一部分。这意味着我希望类属性实际上是属性,其访问由类方法处理。

    Python似乎不直接支持这一点,但是它可以通过子类化 type 班级。所以将一个属性添加到

    2 回复  |  直到 14 年前
        1
  •  1
  •   Matt Anderson    14 年前

    当在类上访问描述符时,通常会返回描述符对象本身。这是什么 property __get__ 方法选择执行)。但这是一个惯例;你不必那样做。

    所以,如果你只需要 吸气剂

    def classproperty_getter_only(f):
        class NonDataDescriptor(object):
            def __get__(self, instance, icls):
                return f(icls)
        return NonDataDescriptor()
    
    class Foo(object):
    
        @classproperty_getter_only
        def flup(cls):
            return 'hello from', cls
    
    print Foo.flup
    print Foo().flup
    

    对于

    ('hello from', <class '__main__.Foo'>)
    ('hello from', <class '__main__.Foo'>)
    

    如果您想要一个完整的数据描述符,或者想要使用内置的属性对象,那么您就可以使用元类并将它放在那里(意识到这个属性对于您的类的实例是完全不可见的;在类的实例上执行属性查找时不检查元类)。

        2
  •  1
  •   Donald Miner    14 年前

    这就是您所说的“类属性实际上是属性,其访问由类方法处理”的意思吗?

    你可以用装饰工 property 使访问者看起来是实际的数据成员。然后,你可以使用 x.setter decorator为该属性创建一个setter。

    object ,否则这行不通。

    class Foo(object):
        def __init__(self):
                self._hiddenx = 3
        @property
        def x(self):
                return self._hiddenx + 10
        @x.setter
        def x(self, value):
                self._hiddenx = value
    
    p = Foo()
    
    p.x #13
    
    p.x = 4
    p.x #14