Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python工厂类继承_Python_Factory - Fatal编程技术网

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我编辑我的问题是为了更好地解释这种情况,希望现在更清楚了