如何检查一个类是否是由工厂类创建的父类的子类?
考虑以下简单的示例:
from itertools import count
def basefactory():
class Base:
_idc = count(0)
def __init__(self):
self._id = next(self._idc)
return Base
然后使用工厂类创建子类:
class A(basefactory()):
def __init__(self):
super().__init__()
class B(basefactory()):
def __init__(self):
super().__init__()
如何测试A
或B
是否是由工厂类创建的类的子类?
如果没有工厂类,我将使用:issubclass(A, Base))
,但这当然不适用于工厂类,因为Base
不是在全局空间中定义的。
这个设置的原因是我希望A
和B
有一个不同的_idc
计数器来为子类的每个实例生成连续的_id
。
如果A
和B
直接从Base
继承,则计数器是共享的。让我举一个例子来说明我的意思。
使用上面描述的工厂类设置,如果我这样做了:
ll = [A(), A(), B(), B()]
for e in ll:
print(e._id, end=", ")
打印:0, 1, 0, 1,
。如果我将Base
移动到全局空间,而A
和B
直接从Base
继承,则前面的代码打印:0, 1, 2, 3,
。
我希望_id
是0, 1, 0, 1,
,这就是我使用工厂类设置的原因。在我的实际情况中,我不只是A
和B
(我有10个由工厂类创建的类,它们将来可能会增加),所以我不想重复自己,在每个子类中初始化计数器。
但是,如果一个类是通过工厂类创建的,那么我还需要断言一个类是否是Base
的子类,或者用其他的术语来说。这就是问题所在。是否可以使用issubclass
检查类层次结构?或者我需要改变设置或使用解决办法,就像人们在评论中建议的那样?
关于拟议中的重复
我不认为是() methods的翻版。我知道super
做什么,在这种特殊情况下没有用。我希望每个子类都有一个不同的计数器,我看不出引用父类有多大帮助。
也许这是有帮助的(如果是的话,请张贴一个答案),但由于提议的复制不涉及工厂类,我认为这个问题仍然不同。
发布于 2019-07-06 07:27:13
我认为一个装饰师会做你想做的事情(向一个类添加一个实例计数器),而不是一个工厂函数,它会生成一个本来不必要的基类。
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=", ")
发布于 2019-06-30 09:38:13
嗯,我不知道如何正确地访问这些信息,但是当输入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)
我知道必须有可能正确地访问它。
https://stackoverflow.com/questions/56376186
复制相似问题