这段代码问题出在哪里啊?课后习题42讲
class Foo:def foo(self):
self.foo = "I love FishC.com!"
return self.foo
>>> foo = Foo()
>>> foo.foo()
'I love FishC.com!'
是不是实例对象调用一次foo方法,其实例对象属性中就由{‘foo’:'I love FishC.com!'}同名属性会覆盖方法,方法就失效了,调用foo.foo这一属性才会显示'I love FishC.com!',我的解释对吗? 没明白你表达的什么意思。。。
追究到底层,类创建的时候默认一个空间,每实例化一个,实例化就拥有自己的独立空间。
所以foo1、foo2、foo3等实例化出来的类对象,空间都是独特的,每个实例化对象下面都有个foo方法,虽然名字一样,但是所属空间并不相同,你可以把实例化后的对象想象为函数不同的局部变量。 本帖最后由 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()方法已经被覆盖了
本帖最后由 永恒的蓝色梦想 于 2020-7-5 20:53 编辑
说的没错。理解很到位。如果还需要使用这个函数的话,可以Foo.foo(foo) 永恒的蓝色梦想 发表于 2020-7-5 20:52
说的没错。理解很到位。如果还需要使用这个函数的话,可以
这是为啥啊,是调用类对象的方法吗,里边的参数是实例对象self,是这样吗? lingedu 发表于 2020-7-5 21:39
这是为啥啊,是调用类对象的方法吗,里边的参数是实例对象self,是这样吗?
是 永恒的蓝色梦想 发表于 2020-7-5 21:45
是
感谢
页:
[1]