运行效果:
c = Counter()
c.x = 1
print(c.counter)
>>> 1
c.y = 2
c.z = 3
print(c.counter)
>>> 3
print(c.attr_name)
>>> [x, y, z]
代码如下:
class Counter:
def __init__(self):
self.counter = 0 # 计算实例中属性个数
self.attr_name = [] # 储存实例中的属性名
def __setattr__(self, name, value):
if name != 'counter' and name != 'attr_name':
if name not in self.attr_name:
self.counter += 1
self.attr_name.append(name)
super().__setattr__(name, value)
def __delattr__(self, name):
self.counter -= 1
self.attr_name.remove(name)
super().__delattr__(name)