我编写了一个元类,它计算每个子类的实例数。所以我的元有一个类似的字典{classname: number_of_instances}。
这是实现:
class MetaCounter(type):
_counter = {}
def __new__(cls, name, bases, dict):
cls._counter[name] = 0
return super().__new__(cls, name, bases, dict)
def __call__(cls, *args, **kwargs):
cls._counter[cls.__name__] += 1
print(f'Instantiated {cls._counter[cls.__name__]} objects of class {cls}!')
return super().__call__(*args, **kwargs)
class Foo(metaclass=MetaCounter):
pass
class Bar(metaclass=MetaCounter):
pass
x = Foo()
y = Foo()
z = Foo()
a = Bar()
b = Bar()
print(MetaCounter._counter)
# {'Foo': 3, 'Bar': 2} --> OK!
print(Foo._counter)
# {'Foo': 3, 'Bar': 2} --> I'd like it printed just "3"
print(Bar._counter)
# {'Foo': 3, 'Bar': 2} --> I'd like it printed just "2"
它工作得很好,但我想添加一定程度的信息隐藏。也就是说,元类为MetaCounter的类不应该具有具有相同元的其他类的实例的计数器。他们应该只知道有关其实例数量的信息。因此应该显示整个dict,但是(让Foo是一个以MetaCounter作为其元类的类)应该只返回Foo实例的数量。MetaCounter._counterFoo._counter
有办法实现这一点吗?
我尝试过覆盖__getattribute__,但最终导致计数逻辑混乱。
我还尝试将其_counter作为属性放入方法dict的参数中__new__,但随后它也成为实例成员,而我不希望如此。
湖上湖
红糖糍粑
相关分类