想摸妹妹大腚 发表于 2020-6-12 10:08:23

这么写为什么没有报错???

没有报错
class Foo:
      def foo(self):
                self.foo = "I love FishC.com!"
                return self.foo

>>> foo = Foo()
>>> foo.foo()
'I love FishC.com!'
报错了
class Foo:
      def __init__(self):
                self.foo = "I love FishC.com!"
      def foo(self):
                return self.foo

>>> foo = Foo()
>>> foo.foo()
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
    foo.foo()
TypeError: 'str' object is not callable
属性名和方法名字相同时,属性会把方法覆盖,为什么第一中没有报错呢?

Twilight6 发表于 2020-6-12 10:29:47


主要因为 __init__ 在实例化时候自动调用,然后按照代码运行顺序来看就能理解为什么:
class Foo:
      def foo(self):
                self.foo = "I love FishC.com!"
                return self.foo
这是第一个代码,当你调用 foo.foo() 时候 是先调用 def foo(self) 这个函数 然后执行函数内的代码 self.foo = "I love FishC.com!"

这个时候才把 foo() 函数给覆盖了,所以这个调用不会报错,是先调用后赋值

然后你在看看这个:
class Foo:
      def __init__(self):
                self.foo = "I love FishC.com!"
      def foo(self):
                return self.foo
__init__ 是在你实例化对象时候自动调用,所以你一 foo = Foo() 就将属性 self.foo = "I love FishC.com!" 覆盖了 def foo(self): 方法

导致你调用 foo.foo() 时候 foo已经是一个属性了而不是一个方法,所以会报错
页: [1]
查看完整版本: 这么写为什么没有报错???