繁体   English   中英

Python工厂类继承

[英]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__()

如何测试AB是工厂班级创建的班级的子级?
如果没有工厂类,我会用: issubclass(A, Base))但当然,这并不与工厂类的工作,因为Base没有在全球空间中定义。

进行此设置的原因是,我希望AB具有不同的_idc计数器,以为子类的每个实例生成连续的_id
如果AB直接从Base继承,则共享计数器。 让我举例说明我的意思。

通过上述工厂类设置,如果这样做:

ll = [A(), A(), B(), B()]   
for e in ll:
    print(e._id, end=", ")

它打印: 0, 1, 0, 1, 相反,如果我在全局空间中移动Base ,而AB直接从Base继承,则先前的代码将输出: 0, 1, 2, 3,

我想_id0, 1, 0, 1,这是我使用的工厂类设置的原因。 在我的实际情况下,我不仅有AB (我有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM