我定义几个类拟用于多重继承,如:检测super()是否具有装饰器的功能?
class A:
def __init__(self, bacon = None, **kwargs):
self.bacon = bacon
if bacon is None:
self.bacon = 100
super().__init__(**kwargs)
class Bacon(A):
def __init__(self, **kwargs):
"""Optional: bacon"""
super().__init__(**kwargs)
class Eggs(A):
def __init__(self, **kwargs):
"""Optional: bacon"""
super().__init__(**kwargs)
class Spam(Eggs, Bacon):
def __init__(self, **kwargs):
"""Optional: bacon"""
super().__init__(**kwargs)
不过,我有多个类(如可能Bacon
,A
和Spam
,但不)是关心他们的时候物业bacon
已更改。他们不需要修改价值,只需要知道新价值是什么,就像事件一样。由于我已经设置了多重继承性质,这意味着必须通知超类有关更改(如果它关心的话)。
我知道,如果我将类名传递给方法装饰器,或者如果我使用类装饰器,这可能是可能的。我不想拥有所有直接的自我类引用,不得不在每个类的上面创建大量装饰器,或者强制方法使用相同的名称,因为这些都不是pythonic。
我希望得到语法看起来是这样的:
@on_change(bacon)
def on_bacon_change(self, bacon):
# read from old/new bacon
make_eggs(how_much = bacon)
我不关心的bacon
以前的值,使培根的说法是没有必要的,如果这是bacon
之后调用已设置。
是否有可能来检查,如果超类与此 装饰的方法?
如果这是不可行的,是否有其他方法可以通过多重继承链传递事件如 ?
编辑:
在垃圾邮件功能的实际调用将在一完成,通过使用@property
和@bacon.setter
,因为这将是初始化bacon
最上面级。一旦知道要调用什么函数self
,问题只在于将调用传递给MI链。
编辑2:
如果我重写了@bacon.setter
属性,是否可以判断是否超()类有bacon
二传手?
很明显OP的意思是“{如果super()有一个函数有装饰器”,而不是“如果super()有一个{有装饰器的函数}“ – ninjagecko 2012-02-24 15:42:07
”None“默认主要用于当你真的需要运行一些感兴趣的东西来获得默认值时。这里你可以使用'def foo(self,bacon = 100,** kwargs ):self.ba con = bacon'虽然你应该使用'def __init __(self,** kwargs):self.bacon = kwargs.get('bacon',100)'如果你试图支持在任意kwargs周围洗牌以真正取悦OOP怪人。 – 2012-02-24 15:51:31
@MikeGraham培根的论点是把它从任何通过的'kwargs'中去掉,因为我不认为默认的'object'会对它感到满意。其意图是,每当到达'object'时,每个参数都被剥离出'kwargs'。 – Darthfett 2012-02-24 17:30:40