鱼C论坛

 找回密码
 立即注册
查看: 2589|回复: 4

[已解决]关于python第45讲作业的问题

[复制链接]
发表于 2019-12-11 09:12:20 | 显示全部楼层 |阅读模式
30鱼币
【测试题】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)

最佳答案
2019-12-11 09:12:21
功能上是能实现的,要知道区别可以看一下类变量和实例变量的区别。
类名.类变量名,实例名.类变量名 访问的实际上是同一个命名空间的变量,所以类变量具有“一改全改”的特点

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

最佳答案

查看完整内容

功能上是能实现的,要知道区别可以看一下类变量和实例变量的区别。 类名.类变量名,实例名.类变量名 访问的实际上是同一个命名空间的变量,所以类变量具有“一改全改”的特点 https://blog.csdn.net/chb4715/article/details/79104376
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-11 09:12:21 | 显示全部楼层    本楼为最佳答案   
功能上是能实现的,要知道区别可以看一下类变量和实例变量的区别。
类名.类变量名,实例名.类变量名 访问的实际上是同一个命名空间的变量,所以类变量具有“一改全改”的特点

https://blog.csdn.net/chb4715/article/details/79104376
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-11 20:44:40 | 显示全部楼层
设置类属性不会触发实例的 __setattr__ 魔法方法。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-11 21:18:35 | 显示全部楼层
zltzlt 发表于 2019-12-11 20:44
设置类属性不会触发实例的 __setattr__ 魔法方法。

谢谢版主~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-11 21:31:50 | 显示全部楼层
$DIM 发表于 2019-12-11 10:18
功能上是能实现的,要知道区别可以看一下类变量和实例变量的区别。
类名.类变量名,实例名.类变量名 访问 ...

明白了,谢谢~!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 06:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表