xianhe0621 发表于 2020-7-20 17:46:14

请问__getattr__这个函数是如何被调用的

class C:
    def __getattr__(self, item):
      print('该属性不存在!')


实例化:
c = C()时,会打印'该属性不存在!'两次
调用不存在属性时:
c.x
会打印'该属性不存在!'三次

xianhe0621 发表于 2020-7-20 17:48:43

>>> class Demo:
      def __getattr__(self, name):
                return '该属性不存在!'

      
>>> demo = Demo()
>>> demo.x
'该属性不存在!'
这是小鲫鱼的答案,有什么不同嘛..

zltzlt 发表于 2020-7-20 17:48:49

这个可能因 Python 版本而异

Twilight6 发表于 2020-7-20 17:53:52

本帖最后由 Twilight6 于 2020-7-20 17:57 编辑



因为你用的是 PyCharm 或者其他编译器的控制台,而不是 IDLE ,你换到 IDLE 就不会这样多次打印

打印多次是正常现象,可能是因为 PyCharm 之类的编译器有着完整的内置环境

所以不必在意,我还见过一次性打印七八次的....这个不影响正常运行代码

而且不止 __getattr__ ,连 __setattr__ 之类的也会这样

xianhe0621 发表于 2020-7-20 17:56:27

zltzlt 发表于 2020-7-20 17:48
这个可能因 Python 版本而异

我的是3.8版本,请问可以讲的具体一点嘛,不是很理解何时调用__getattr__~

xianhe0621 发表于 2020-7-20 17:58:47

感谢大佬们的解答

xianhe0621 发表于 2020-7-20 18:00:56

Twilight6 发表于 2020-7-20 17:53
因为你用的是 PyCharm 或者其他编译器的控制台,而不是 IDLE ,你换到 IDLE 就不会这样多次打印

打 ...

确实,在IDLE里面就没有这种问题

Twilight6 发表于 2020-7-20 18:02:27

xianhe0621 发表于 2020-7-20 18:00
确实,在IDLE里面就没有这种问题



哈~我当时学到这节课时候也发帖问了论坛的大佬,我用的是 PyCharm

xianhe0621 发表于 2020-7-20 18:05:37

Twilight6 发表于 2020-7-20 18:02
哈~我当时学到这节课时候也发帖问了论坛的大佬,我用的是 PyCharm

哈哈,我是看了大佬你讲pycharm的帖子之后开始用pycharm的,确实很方便{:10_297:}

Twilight6 发表于 2020-7-20 18:06:35

xianhe0621 发表于 2020-7-20 18:05
哈哈,我是看了大佬你讲pycharm的帖子之后开始用pycharm的,确实很方便

{:10_281:} 嘿嘿~
页: [1]
查看完整版本: 请问__getattr__这个函数是如何被调用的