Python metaclasses vs class decorators

后端 未结 2 1352
太阳男子
太阳男子 2021-01-30 05:39

What are the main differences between Python metaclasses and class decorators? Is there something I can do with one but not with the other?

2条回答
  •  轮回少年
    2021-01-30 06:03

    As given in the chapter 21 of the book 'fluent python', one difference is related to inheritance. Please see these two scripts. The python version is 3.5. One point is that the use of metaclass affects its children while the decorator affects only the current class.

    The script use class-decorator to replace/overwirte the method 'func1'.

    def deco4cls(cls):
        cls.func1 = lambda self: 2
        return cls
    
    
    @deco4cls
    class Cls1:
        pass
    
    
    class Cls1_1(Cls1):
        def func1(self):
            return 3
    
    
    obj1_1 = Cls1_1()
    print(obj1_1.func1())  # 3
    

    The script use metaclass to replace/overwrite the method 'func1'.

    class Deco4cls(type):
        def __init__(cls, name, bases, attr_dict):
            # print(cls, name, bases, attr_dict)
            super().__init__(name, bases, attr_dict)
            cls.func1 = lambda self: 2
    
    
    class Cls2(metaclass=Deco4cls):
        pass
    
    
    class Cls2_1(Cls2):
        def func1(self):
            return 3
    
    
    obj2_1 = Cls2_1()
    print(obj2_1.func1())  # 2!! the original Cls2_1.func1 is replaced by metaclass
    

提交回复
热议问题