【问题标题】:Custom property with setter带有 setter 的自定义属性
【发布时间】:2011-10-17 20:08:46
【问题描述】:

我正在寻找 property 内置函数的纯 Python 实现,以了解初始化的工作原理。我发现许多处理描述符接口(@98​​7654324@、__set__)但没有描述setterdeleter 方法。这是Python Decorator Library中的definition(大致)它的实现方式吗?

【问题讨论】:

    标签: python properties descriptor


    【解决方案1】:

    属性是一个简单直接的描述符。描述符协议由三种方法组成:__get____set____delete__。每个操作的属性都只是调用用户提供的函数。

    class my_property(object):
        def __init__(self, getter, setter, deleter):
            self.getter  = getter
            self.setter  = setter
            self.deleter = deleter
    
        def __get__(self, instance, owner):
            return self.getter(instance)
    
        def __set__(self, instance, value):
            self.setter(instance, value)
    
        def __delete__(self, instance):
            self.deleter(instance)
    
    class Foo(object):
        def __init__(self):
            self._x = 42
    
        def get_x(self):
            print 'getter'
            return self._x
    
        def set_x(self, value):
            print 'setter'
            self._x = value
    
        def del_x(self):
            print 'deleter'
            del self._x
    
        x = my_property(get_x, set_x, del_x)
    
    obj = Foo()
    print obj.x
    obj.x = 69
    del obj.x
    print obj.x
    

    【讨论】:

    • 我对setter方法(property.setter)是如何实现的很感兴趣。
    • @Hernan:它改变了fset 并返回self(或者可能返回其自身的副本,我不太记得了)。不涉及火箭科学。
    • 这就是我的想法,但是在我放在帖子中的链接中,并通过查看我从属性子类化并在 init 似乎是在再次创建属性,而不仅仅是更改 fset。真的是这样吗?这是为什么呢?
    • @Hernan:嗯,返回一个更改了fset 的副本也是有效的。
    【解决方案2】:

    作为评论:有一种简单的方法可以将属性添加到 Python 列表对象。在类中变形。

    >>> class Foo(list): pass
    >>> l = Foo([1,2,3])
    >>> l.foo = 'bar'
    >>> l
    [1, 2, 3]
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      相关资源
      最近更新 更多