【发布时间】:2012-11-14 11:48:45
【问题描述】:
如何以正确的方式装饰一个类,以便能够从被装饰的类中继承一个类?有没有正确的方法?
如果我会这样做:
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同样的问题,function没有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__ 修改类实例,但这绝对是另一回事...
【问题讨论】:
-
这与你的问题无关,但不需要使用类的
id()作为dict键,你可以使用类本身(类是可散列的)。跨度>
标签: python decorator subclassing class-method