【发布时间】:2015-01-18 01:17:21
【问题描述】:
考虑一下代码:
class Meta(type):
def __init__(cls, name, bases, attrs):
def method(self):
print('generated method call')
cls.method = method
super(Meta, cls).__init__(name, bases, attrs)
class A(object):
__metaclass__ = Meta
def method(self):
raise NotImplementedError
def decorator(fn):
def wrapper(*args, **kwargs):
print('decorator call')
return fn(*args, **kwargs)
return wrapper
class Decorator(object):
"""Mysterious mixin that should wrap `method` with `decorator`
at class generation time. And this effect should work on subclasses too!
"""
def __call__(self, cls):
cls.method = decorator(cls.method)
return cls
@Decorator()
class B(A):
pass
B().method() # outputs "decorated call generated method call"
class D(B):
pass
D().method() # outputs only "generated method call"
这里我有一个基类A,它有一个生成method 的元类。
比我有Decorator 类装饰器,它为装饰类的method 添加了一些效果。
它在装饰类B 上完美运行,但它的效果不可继承,因此D 不会继承该效果。
这就是我想要实现的 - 学习如何制作可继承的类装饰器。或者它可以被称为元类混合。
如何实现这个效果?我对元类的所有尝试都因metaclass conflict 错误而失败。
【问题讨论】:
-
简要提示:
class DecoratorMeta(Meta); class B(A): __metaclass__ = DecoratorMeta -
@o11c 如果我有多个 mixin 怎么办?
-
完全可以在函数中本地定义一个新的元类
-
@o11c 你的意思是 - 生成元类?
标签: python metaprogramming decorator metaclass python-decorators