2 回答

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
我不知道足夠的元類(lèi)來(lái)判斷做你正在嘗試的事情是否是一個(gè)壞主意,但這是可能的。
您可以MetaCounter僅保留對(duì)其“元類(lèi)”類(lèi)的引用,并通過(guò)更新dictinMetaCounter.__new__方法為每個(gè)類(lèi)添加特定的實(shí)例計(jì)數(shù)器:
class MetaCounter(type):
_classes = []
def __new__(cls, name, bases, dict):
dict.update(_counter=0)
metaclassed = super().__new__(cls, name, bases, dict)
cls._classes.append(metaclassed)
return metaclassed
每次MetaCounter實(shí)例化一個(gè)新類(lèi)時(shí),都會(huì)增加計(jì)數(shù)器
def __call__(cls, *args, **kwargs):
cls._counter += 1
print(f'Instantiated {cls._counter} objects of class {cls}!')
return super().__call__(*args, **kwargs)
這確保每個(gè)MetaCounter類(lèi)擁有其實(shí)例計(jì)數(shù)器并且不知道其他MetaCounter類(lèi)的任何信息。
然后,要獲取所有計(jì)數(shù)器,您可以_counters向 中添加一個(gè)靜態(tài)方法MetaCounter,該方法返回每個(gè)類(lèi)的計(jì)數(shù)器MetaCounter:
@classmethod
def _counters(cls):
return {klass: klass._counter for klass in cls._classes}
然后你就完成了:
print(MetaCounter._counters()) # {<class '__main__.Foo'>: 3, <class '__main__.Bar'>: 2}
print(Foo._counter) # 3
print(Bar._counter) # 2

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是一個(gè)工作示例,使用描述符根據(jù)屬性是由實(shí)例(類(lèi))_counter訪問(wèn)還是由類(lèi)(本例中為元類(lèi))訪問(wèn)來(lái)修改屬性的行為
class descr:
def __init__(self):
self.counter = {}
self.previous_counter_value = {}
def __get__(self, instance, cls):
if instance:
return self.counter[instance]
else:
return self.counter
def __set__(self, instance, value):
self.counter[instance] = value
class MetaCounter(type):
_counter = descr()
def __new__(cls, name, bases, dict):
new_class = super().__new__(cls, name, bases, dict)
cls._counter[new_class] = 0
return new_class
def __call__(cls, *args, **kwargs):
cls._counter += 1
print(f'Instantiated {cls._counter} objects of class {cls}!')
return super().__call__(*args, **kwargs)
添加回答
舉報(bào)