【问题标题】:Add @property method to a class将@property 方法添加到类
【发布时间】:2014-11-20 15:34:34
【问题描述】:

可以通过以下方式向 python 类添加方法:

class foo(object):
    pass

def donothing(self):
    pass

foo.y = donothing

然后人们会调用该方法:

f = foo()
f.y()

有没有办法将@property 也添加到def,所以用它来调用它

f.y

?

【问题讨论】:

    标签: python oop syntactic-sugar


    【解决方案1】:

    分配property的返回值:

    >>> class foo(object):
    ...     pass
    ...
    >>> def donothing(self):
    ...     print('donothing is called')
    ...
    >>> foo.y = property(donothing)  # <----
    >>> f = foo()
    >>> f.y
    donothing is called
    

    【讨论】:

      【解决方案2】:

      你可以在方法定义之前添加@property

      ... class Foo(object):
      ...    pass
      ...
      >>> @property
      ... def bar(self):
      ...     print("bar is called")
      ... 
      >>> Foo.bar = bar
      >>> f = Foo()
      >>> f.bar
      bar is called
      

      【讨论】:

        【解决方案3】:

        当然,可以指定为:

        class foo(object):
            def __int__(self):
                self._y = None
        
            @property
            def y(self):
                return self._y
        
            @y.setter
            def y(self, value):
                self._y = value
        
        
        
        >>>>x = foo()
        >>>>x.y = str
        >>>>print type(x.y(12.345)), x.y(12.345)
        <type 'str'> 12.345
        

        在这里,我只是说属性 y(是的属性而不是方法!)设置为 value。由于 Python 中的一切都是对象,因此我可以完美地将函数分配给变量。与属性 y (作为属性)关联的方法返回属性的值,该值变成一个函数(在这种情况下为 str )。返回的值用作可调用对象,这正是我们所期望的。但是,访问属性 y 会返回一个可调用的,有效地调用 str()

        我可以像这样为 y 分配任何功能:

        def double(x):
            return 2 * x
        
        ...
        
        >>>>x.y = double
        >>>>print x.y(33)
        66
        

        等等……

        【讨论】:

        • OP 没有说donothing 是foo 的方法。
        猜你喜欢
        • 2011-07-28
        • 2016-04-04
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        相关资源
        最近更新 更多