如何以正確的方式裝飾類以便能夠從裝飾類繼承類?有沒有正確的方法?裝飾類繼承和類方法
如果我會做這樣的事情:
def singleton(cls):
inst = {}
def get(*args, **kwargs):
cls_id = id(cls)
if cls_id not in inst:
inst[cls_id] = cls(*args, **kwargs)
return inst[cls_id]
return get
@singleton
class A(object):
@classmethod
def cls_meth(cls):
return cls
我有沒有機會繼承一個以上的一類,因爲之前我把它稱作是這樣的功能。與類方法相同的問題,函數沒有類方法。
class B(A): # No way! `A` is the function!
pass
A.cls_meth() # AttributeError: 'function' object has no attribute 'cls_meth'
即使我做這樣的事情:
class SingletonDecorator(object):
inst = {}
def __init__(self, cls):
self.cls = cls
def __call__(self, *args, **kwargs):
cls_id = id(self.cls)
if cls_id not in self.inst:
self.inst[cls_id] = self.cls(*args, **kwargs)
return self.inst[cls_id]
@SingletonDecorator
class A(object):
pass
當我從A
類繼承一個類時,它會從SingletonDecorator
類,而不是A
繼承。
class B(A): # No no no! I do not need a `SingletonDecorator` child class...
pass
有通過__metaclass__
修改類實例的方式,但卻是完全另一回事了
這是不相關的問題,但沒有必要使用'ID()'一類的字典鍵,你可以只使用類本身(類可哈希)。 – kindall