[英]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.