装飾されたクラスからクラスを継承できるように、クラスを正しい方法で装飾する方法は? 正しい方法はありますか?
私が次のようなことをするなら:
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__
が、それはまったく別の話です...