我定義幾個類擬用於多重繼承,如:檢測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