gux 发表于 2021-2-4 00:24:41

改写类的__getattr__方法

请看如下代码:
class Demo:
    def __getattr__(self, name):
      self.name = 'FishC'


demo = Demo()
print(demo.x)

我预计它的运行结果是 FishC, 但实际上是 None. 为什么?

kogawananari 发表于 2021-2-4 02:25:00

不是应该return 'FishC'吗

kishere 发表于 2021-2-4 11:46:13

demo实例里没有x成员, 执行之后, 你给demo加了一个成员name, 没有返回值, 直接打印demo.x肯定是没有的

°蓝鲤歌蓝 发表于 2021-2-4 17:15:50

getattr 要配合 setattr 来使用的

BSOD 发表于 2021-2-4 22:57:27

1. __getattr__函数类不能使用self.xx, 否则会陷入递归.
2. __getattr__函数需要返回一个函数, 对象或者AttributeError异常, 没有返回表示返回None, 所以你只能获取到None
可以将代码修改为:
class Demo:
    def __getattr__(self, name):
      return 'FishC'


demo = Demo()
print(demo.x)

Twilight6 发表于 2021-2-4 00:24:42


__getattr__ 在你访问类属性时会自动调用并返回值

而你重写的__getattr__ 魔法方法没有设置返回值,那么 Python 就默认将返回值设置为 None

在你定义的__getattr__ 中加上 return 即可,参考代码:

class Demo:
    def __getattr__(self, name):
      self.name = 'FishC'
      return self.name

demo = Demo()
print(demo.x)
页: [1]
查看完整版本: 改写类的__getattr__方法