我正在嘗試創建一個具有類屬性的 Python 類,以接收具有所有子類物件的字典。
下面我在我想要完成的內容中制作了一個示例代碼,但我不能讓類方法在類初始化時運行。我覺得我以錯誤的方式解決問題,所以任何建議都將受到歡迎。
class Client:
enable = True
subclass_dict = {}
def __init__(self, category, limit):
self.category = category
self.limit = limit
if Client.enable == True:
Client.enable = False
Client.get_subclasses()
@classmethod
def get_subclasses(cls):
subclasses = cls.__subclasses__()
for subclass in subclasses:
cls.subclass_dict[subclass().category] = subclass()
def __str__(self):
return f'{self.category}'
def __repr__(self):
return f'Client: {self.category}'
class SpecialClient(Client):
category = 'Special'
limit = '10_000'
def __init__(self):
super().__init__(SpecialClient.category, SpecialClient.limit)
class NormalClient(Client):
category = 'Normal'
limit = 1_000
def __init__(self):
super().__init__(NormalClient.category, NormalClient.limit)
uj5u.com熱心網友回復:
有一種簡單的方法可以創建一個子類“注冊表”,這實際上就是您正在做的事情,但是使用object.__init_subclass__()Python 3.6 中添加的泛型,通過使用它自動創建它們的“注冊表”而不是使用它來簡化子類的查找可能必須像get_subclasses()方法一樣遞回地檢查每個子類。
我從 PEP 487 中的子類注冊部分得到了使用__init_subclass__()來執行此操作的想法——更簡單的類創建提案的自定義。由于該方法將被所有基類的子類繼承,因此子子類也將自動進行注冊(而不僅僅是直接子類)——它完全不需要像.get_subclasses()
我已將您的代碼轉換為執行此操作,并消除了get_subclasses()您的方法。里面可能還有一些無關緊要的東西,因為我不確定你對它們有什么目的。
class Client:
enable = True
subclass_dict = {}
def __init__(self, category, limit):
self.category = category
self.limit = limit
if Client.enable == True:
Client.enable = False
@classmethod
def __init_subclass__(cls, /, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclass_dict[cls.category] = cls # Add (sub)class to registry.
def __str__(self):
return f'{self.category}'
def __repr__(self):
return f'Client: {self.category}'
class SpecialClient(Client):
category = 'Special'
limit = '10_000'
def __init__(self):
super().__init__(SpecialClient.category, SpecialClient.limit)
class NormalClient(Client):
category = 'Normal'
limit = 1_000
def __init__(self):
super().__init__(NormalClient.category, NormalClient.limit)
if __name__ == '__main__':
from pprint import pprint
print('Client.subclass_dict:')
pprint(Client.subclass_dict)
# Verify __str__() and __repr__() were inherited.
special = SpecialClient()
print(f'{str(special)=!r}')
print(f'{repr(special)=!r}')
列印結果:
Client.subclass_dict:
{'Normal': <class '__main__.NormalClient'>,
'Special': <class '__main__.SpecialClient'>}
str(special)='Special'
repr(special)='Client: Special'
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/440084.html
上一篇:使用exec修改類中的全域變數
下一篇:為什么不呼叫派生類解構式?
