Python工厂类继承

时间:2019-05-30 10:13:38

标签: python factory

如何检查类是否是工厂类创建的父级的子级?

考虑以下简单示例:

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

如何测试AB是工厂类创建的类的子代?
如果没有工厂类,我会使用:issubclass(A, Base)),但是由于工厂Base没有在全局空间中定义,因此这当然不适用于工厂类。

如果您想知道为什么我首先使用工厂类,原因仅仅是为了更好地理解工厂类:在这种情况下,我希望每个孩子都有自己的_idc计数器,但我不想在每个子类中编写_idc = count(0)self._id = next(self._idc)
我认为工厂班级可以避免我在所有孩子中都写相同的文字。

2 个答案:

答案 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)

我知道必须能够正确访问它