zm_selina 发表于 2019-12-11 09:12:20

关于python第45讲作业的问题

【测试题】4. 请指出以下代码的问题所在:
class Counter:
      def __init__(self):
                self.counter = 0
      def __setattr__(self, name, value):
                self.counter += 1
                super().__setattr__(name, value)
      def __delattr__(self, name):
                self.counter -= 1
                super().__delattr__(name)

动动手2. 修改上边【测试题】第 4 题,使之可以正常运行:编写一个 Counter 类,用于实时检测对象有多少个属性。
>>> c = Counter()
>>> c.x = 1
>>> c.counter
1
>>> c.y = 1
>>> c.z = 1
>>> c.counter
3
>>> del c.x
>>> c.counter
2
【甲鱼老师的答案】
class Counter:
      def __init__(self):
                super().__setattr__('counter', 0)
      def __setattr__(self, name, value):
                super().__setattr__('counter', self.counter + 1)
                super().__setattr__(name, value)
      def __delattr__(self, name):
                super().__setattr__('counter', self.counter - 1)
                super().__delattr__(name)

在类中定义属性(静态变量),也能达到预期的目的,不知道有什么问题,请各位大佬给我讲讲:
class Counter:
    counter = 0
    def __setattr__(self, name, value):
      Counter.counter += 1
      super().__setattr__(name, value)
    def __delattr__(self, name):
      Counter.counter -= 1
      super().__delattr__(name)

$DIM 发表于 2019-12-11 09:12:21

功能上是能实现的,要知道区别可以看一下类变量和实例变量的区别。
类名.类变量名,实例名.类变量名 访问的实际上是同一个命名空间的变量,所以类变量具有“一改全改”的特点

https://blog.csdn.net/chb4715/article/details/79104376

zltzlt 发表于 2019-12-11 20:44:40

设置类属性不会触发实例的 __setattr__ 魔法方法。

zm_selina 发表于 2019-12-11 21:18:35

zltzlt 发表于 2019-12-11 20:44
设置类属性不会触发实例的 __setattr__ 魔法方法。

谢谢版主~~

zm_selina 发表于 2019-12-11 21:31:50

$DIM 发表于 2019-12-11 10:18
功能上是能实现的,要知道区别可以看一下类变量和实例变量的区别。
类名.类变量名,实例名.类变量名 访问 ...

明白了,谢谢~!
页: [1]
查看完整版本: 关于python第45讲作业的问题