如何以正确的方式装饰一个类以便能够从被装饰的类中继承一个类?是否存在正确的方法?
如果我会做类似的事情:
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
我没有机会从上面继承一个类,因为在我调用它之前这是函数。classmethods 有同样的问题,函数没有 classmethods。
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__
,但这绝对是另一回事......