ee鱼c 发表于 2020-7-7 15:07:59

46讲魔法方法属性访问结果有出入

class C:
    def __getattribute__(self,name):
      print('getattribute')
      return super().__getattribute__(name)
    def __getattr__(self, name):
      print('getattr')
    def __setattr__(self, name, value):
      print('setattr')
      super().__setattr__(name,value)
    def __delattr__(self, item):
      print('delattr')
      super().__delattr__(name)

c = C()
对象实例化后直接调用近20次getattribute,想知道什么原因(无法上传图片)

Twilight6 发表于 2020-7-7 15:09:53




你用的应该是其他编译器比如 PyCharm 吧,这个多次打印是正常现象,这些可以不用管,你用 IDLE 时候就不会这样了

这些不影响你的正常使用,这样自动打印多次可能是因为 PyCharm 之类的编译器有完整的内置环境吧


qiuyouzhi 发表于 2020-7-7 15:57:58

楼上正解,PyCharm会自动帮你执行一些操作,比如关闭文件,并且销毁对象等。

Stubborn 发表于 2020-7-7 18:44:31

本帖最后由 Stubborn 于 2020-7-7 18:50 编辑

PyCharm测试一个都没有,用的什么编辑器的?这个是完整代码了?自定义属性被访问时的行为,你这个代码,什么都没有,进行实例化,不应该被触发



__getattribute__(self, name)
__getattribute__ 允许你自定义属性被访问时的行为,它也同样可能遇到无限递归问题(通过调用基类的 __getattribute__ 来避免)。 __getattribute__ 基本上可以替代 __getattr__ 。只有当它被实现,并且显式地被调用,或者产生 AttributeError 时它才被使用。 这个魔法方法可以被使用(毕竟,选择权在你自己),我不推荐你使用它,因为它的使用范围相对有限(通常我们想要在赋值时进行特殊操作,而不是取值时),而且实现这个方法很容易出现Bug。

ee鱼c 发表于 2020-7-8 14:28:33

确实是pycharm,如果是正常情况我就不用担心了

Twilight6 发表于 2020-7-8 14:34:14

ee鱼c 发表于 2020-7-8 14:28
确实是pycharm,如果是正常情况我就不用担心了

没事 我当时学习的时候也被吓一跳了
页: [1]
查看完整版本: 46讲魔法方法属性访问结果有出入