如何检查类是否是工厂类创建的父级的子级?
考虑以下简单示例:
from itertools import count
def basefactory():
class Base:
_idc = count(0)
def __init__(self):
self._id = next(self._idc)
return Base
然后我使用工厂类创建子代:
class A(basefactory()):
pass
class B(basefactory()):
pass
如何测试A
或B
是工厂类创建的类的子代?
如果没有工厂类,我会使用:issubclass(A, Base))
,但是由于工厂Base
没有在全局空间中定义,因此这当然不适用于工厂类。
如果您想知道为什么我首先使用工厂类,原因仅仅是为了更好地理解工厂类:在这种情况下,我希望每个孩子都有自己的_idc
计数器,但我不想在每个子类中编写_idc = count(0)
和self._id = next(self._idc)
。
我认为工厂班级可以避免我在所有孩子中都写相同的文字。
答案 0 :(得分:1)
我认为装饰器会比生成不需要的基类的工厂函数更简单地完成您想要的操作(向类添加实例计数器)。
from itertools import count
def add_counter(cls):
cls._idc = count(0)
old_init = cls.__init__
def __init__(self, *args, **kwargs):
old_init(self, *args, **kwargs)
self._id = next(self._idc)
cls.__init__ = __init__
return cls
@add_counter
class A:
pass
@add_counter
class B:
pass
ll = [A(), A(), B(), B()]
for e in ll:
print(e._id, end=", ")
答案 1 :(得分:0)
好吧,我不知道如何正确访问此信息,但是键入help(A)
时,您会得到Base
:
Help on class A in module __main__:
class A(Base)
| Method resolution order:
| A
| Base
| builtins.object
|
| Methods inherited from Base:
|
| __init__(self)
|
| ----------------------------------------------------------------------
| Data descriptors inherited from Base:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
我知道必须能够正确访问它