相关疑难解决方法(0)

如何装饰一个类?

在Python 2.5中,有没有办法创建一个装饰类的装饰器?具体来说,我想使用装饰器将一个成员添加到类中,并更改构造函数以获取该成员的值.

寻找类似下面的内容(在'class Foo:'上有语法错误:

def getId(self): return self.__id

class addID(original_class):
    def __init__(self, id, *args, **kws):
        self.__id = id
        self.getId = getId
        original_class.__init__(self, *args, **kws)

@addID
class Foo:
    def __init__(self, value1):
        self.value1 = value1

if __name__ == '__main__':
    foo1 = Foo(5,1)
    print foo1.value1, foo1.getId()
    foo2 = Foo(15,2)
    print foo2.value1, foo2.getId()
Run Code Online (Sandbox Code Playgroud)

我想我真正想要的是在Python中做一些类似C#接口的方法.我想我需要切换我的范例.

python decorator python-2.5

118
推荐指数
6
解决办法
10万
查看次数

如何为Python属性实现__iadd__

我正在尝试创建一个Python属性,其中就地添加由不同的方法处理,而不是检索值,添加另一个值并重新分配.因此,对于x对象上的属性o,

o.x += 5
Run Code Online (Sandbox Code Playgroud)

应该不同于

o.x = o.x + 5
Run Code Online (Sandbox Code Playgroud)

最终的价值o.x应该是相同的,以免混淆人们的期望,但我想让就地增加更有效率.(实际上,操作比简单添加需要更多的时间.)

我的第一个想法是在课堂上定义

x = property(etc. etc.)
x.__iadd__ = my_iadd
Run Code Online (Sandbox Code Playgroud)

但这引发了一个AttributeError,大概是因为property工具__slots__

我的下一次尝试使用描述符对象:

class IAddProp(object):
    def __init__(self):
        self._val = 5

    def __get__(self, obj, type=None):
        return self._val

    def __set__(self, obj, value):
        self._val = value

    def __iadd__(self, value):
        print '__iadd__!'
        self._val += value
        return self

class TestObj(object):
    x = IAddProp()
    #x.__iadd__ = IAddProp.__iadd__  # doesn't help

>>> o = TestObj()
>>> print o.x
5 …
Run Code Online (Sandbox Code Playgroud)

python properties descriptor magic-methods

13
推荐指数
2
解决办法
4355
查看次数