|
发表于 2020-7-5 20:46:43
|
显示全部楼层
本楼为最佳答案
本帖最后由 Twilight6 于 2020-7-5 20:50 编辑
是不是实例对象调用一次foo方法,其实例对象属性中就由{‘foo’:'I love FishC.com!'}同名属性会覆盖方法,方法就失效了,调用foo.foo这一属性才会显示'I love FishC.com!',我的解释对吗?
是的,因为你当调用类中的 foo 方法时候 会设置属性 foo 的值导致覆盖了方法 foo() 最后导致你下次再次调用就会报错
因为此时这个实例对象你调用一次了 foo 之后,foo 就从方法变成了 实例属性,被实例属性所覆盖,你试着这样运行就会报错:
- class Foo:
- def foo(self):
- self.foo = "I love FishC.com!"
- return self.foo
- foo = Foo()
复制代码
我们用 __dict__ 属性来查看对象内部所有属性名和属性值组成的字典
首先:
- >>> print(foo.__dict__) # 第一次实例化打印属性,发现没有
- {}
复制代码
然后:
- >>> print(foo.foo()) # 成功调用,并且打印返回值
- I love FishC.com!
复制代码
继续:
- >>> print(foo.__dict__) # 因为调用了 foo() 方法,所以此时设置了一个属性 foo
- {'foo': 'I love FishC.com!'}
复制代码
最后:
- >>> print(foo.foo()) # 成功报错
- Traceback (most recent call last):
- File "M:/Python data/My Project/Work.py", line 10, in <module>
- print(foo.foo())
- TypeError: 'str' object is not callable # 字符串不可调用,因为此时的 foo 是个属性,而且值属于字符串,之前的 foo()方法已经被覆盖了
复制代码
|
|