[英]Python factory class inheritance
如何检查某个类是否是由工厂类创建的父级的子级?
考虑以下简单的示例:
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
检查类层次结构来issubclass
? 还是我需要更改设置或使用类似注释中建议的解决方法?
我不认为使用__init__
()方法可以理解Python super() 。 我知道super
做什么,并且在此特定情况下没有用。 我希望每个子类都有一个不同的计数器,我看不到引用父类有什么帮助。
也许是有帮助的(如果是这样,请发表答案),但是由于建议的重复项无法处理工厂类,因此我认为这个问题仍然不同。
我认为装饰器会比生成其他不必要的基类的工厂函数更简单地执行您想要的操作(向类添加实例计数器)。
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=", ")
好吧,我不知道如何正确访问此信息,但是当键入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)
我知道必须能够正确访问它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.