Python工厂类继承
如何检查类是否是由工厂类创建的父类的子类 考虑以下简单的例子:Python工厂类继承,python,factory,Python,Factory,如何检查类是否是由工厂类创建的父类的子类 考虑以下简单的例子: from itertools import count def basefactory(): class Base: _idc = count(0) def __init__(self): self._id = next(self._idc) return Base 然后,我使用factory类创建子项: class A(basefactory()):
from itertools import count
def basefactory():
class Base:
_idc = count(0)
def __init__(self):
self._id = next(self._idc)
return Base
然后,我使用factory类创建子项:
class A(basefactory()):
def __init__(self):
super().__init__()
class B(basefactory()):
def __init__(self):
super().__init__()
如何测试A
或B
是否是工厂类创建的类的子类?如果没有工厂类,我将使用:
issubclass(A,Base))
,但这当然不适用于工厂类,因为Base
不是在全局空间中定义的
此设置的原因是我希望A
和B
具有不同的\u idc
计数器,以便为每个子类实例生成连续的\u id
。如果
A
和B
直接从Base
继承,则计数器被共享。让我举例说明我的意思
使用上述factory类设置,如果我这样做:
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、
我希望\u id
为0,1,0,1,
,这就是我使用factory类设置的原因。
在我的真实案例中,我没有A
和B
(我有10个由factory类创建的类,它们将来可能会增加),所以我不想重复我自己并初始化每个子类中的计数器
但是,我还需要断言类是否是Base
的子类,或者换句话说,如果它是通过factory类创建的。这就是问题所在。是否可以使用issubclass
检查类层次结构?或者我需要更改设置或使用类似于评论中建议的解决方法
关于提议的复制品
我不认为这是一个复制品。我知道super
的作用,在这种特定情况下没有用处。我希望每个子类都有一个不同的计数器,我不认为引用父类有什么帮助。也许这是有帮助的(如果是,请发布一个答案),但由于建议的副本不涉及工厂类,我认为这个问题仍然不同。好吧,我不知道如何正确访问此信息,但当键入
帮助(A)
时,您会得到Base
:
模块uuu main中的类A帮助:
甲级(基本)
|方法解析顺序:
|A
|基地
|内置对象
|
|从基继承的方法:
|
|_uuu初始(自我)
|
| ----------------------------------------------------------------------
|从基继承的数据描述符:
|
|_uuudict__
|实例变量字典(如果已定义)
|
|_uuuweakref__
|对象的弱引用列表(如果已定义)
我知道必须能够正确地访问它我认为装饰器会做你想做的事情(向类添加实例计数器),而不是生成不必要基类的工厂函数
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=", ")
简而言之,你没有。您必须保存对制造类的引用,以便与之进行比较。你应该研究
\uuuu new\uuuu
来实现你的计数器,而不是你当前的方法。这是一个很难回答的问题,因为你当前的设置无法做到这一点,而且有很多不同的方法来实现它。。。您可以使用元类,或者让Base
从另一个类继承,或者您可以重写Base
,以便它分别计算每个子类的实例,等等。请记住,a
和B
不共享基类;他们每个人都有不同的基础,两者恰好有相同的名字。有什么理由重复创建不同但在其他方面相同的类吗?@chepner我编辑我的问题是为了更好地解释这种情况,希望现在更清楚了