如何装饰一堂课?

发布于 2021-01-29 15:12:46

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

寻找类似以下的内容(在“ 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()

我想我真正想要的是在Python中执行类似C#接口的方法。我想我应该改变我的范式。

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我的观点是您可能希望考虑一个子类,而不是您概述的方法。但是,不知道您的具体情况,YMMV :-)

    您正在考虑的是元类。__new__元类中的函数将传递该类的完整建议定义,然后可以在创建类之前将其重写。那时,您可以将构造函数细分为一个新的。

    例:

    def substitute_init(self, id, *args, **kwargs):
        pass
    
    class FooMeta(type):
    
        def __new__(cls, name, bases, attrs):
            attrs['__init__'] = substitute_init
            return super(FooMeta, cls).__new__(cls, name, bases, attrs)
    
    class Foo(object):
    
        __metaclass__ = FooMeta
    
        def __init__(self, value1):
            pass
    

    替换构造函数可能有点麻烦,但是语言确实为这种深入的内省和动态修改提供了支持。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看