为什么在Python类_uinit_uuu内调用函数既可以是属性也可以是方法?
我对Python类的方法和属性感到非常困惑。假设我们有这样一个Python类:为什么在Python类_uinit_uuu内调用函数既可以是属性也可以是方法?,python,python-class,Python,Python Class,我对Python类的方法和属性感到非常困惑。假设我们有这样一个Python类: # case 1 class Person: def __init__(self, first, last): self.first = first self.last = last self.fun() def fun(self): value = self.first + '---' + self.last se
# case 1
class Person:
def __init__(self, first, last):
self.first = first
self.last = last
self.fun()
def fun(self):
value = self.first + '---' + self.last
self.fun = value
return value
person_1 = Person('A', 'B')
person_1.fun
---> "A---B"
正如我们所看到的,在案例_1中,我们初始化一个实例person_1
。我们可以通过调用fun
作为属性来获得想要的结果。但是,如果我们将代码更改为以下内容,fun
将成为一种方法
你能告诉我为什么会这样吗?在Python类中使用函数作为属性的正确方法是什么?提前非常感谢 啊哈,我想我明白了 在案例1中,我们只需在初始化实例时运行函数
fun()
。由于它在fun()
中定义了属性self.fun=value
,因此fun
可以用作属性。(它不能再用作方法,因为它已被替换为属性。)
在案例2中,我们只调用并运行这个函数。但是fun
没有被定义为类内的属性。这就是为什么它仍然是一种方法
在案例3中,
fun
是一个方法,但在这个方法中,我们定义了一个属性fun
。因此,我们可以先初始化一个实例,然后运行函数fun
。在那之后,属性fun
被添加到这个实例中,然后我们可以将它称为person\u 1。fun
啊哈,我想我已经搞定了
在案例1中,我们只需在初始化实例时运行函数fun()
。由于它在fun()
中定义了属性self.fun=value
,因此fun
可以用作属性。(它不能再用作方法,因为它已被替换为属性。)
在案例2中,我们只调用并运行这个函数。但是fun
没有被定义为类内的属性。这就是为什么它仍然是一种方法
在案例3中,
fun
是一个方法,但在这个方法中,我们定义了一个属性fun
。因此,我们可以先初始化一个实例,然后运行函数fun
。之后,属性fun
被添加到此实例中,然后我们可以将其称为person\u 1.fun
在案例1中,您的构造函数调用fun(),其中有一行用属性值覆盖自身。这令人困惑,而且不是一件好事,因为它令人困惑
在案例2中,您的fun方法不包括要覆盖自身的行,因此不会被覆盖
在案例3中,您从未实际调用过fun方法,因此它永远没有机会覆盖自身。如果用person_1.fun()调用它,即用括号调用,那么它将执行并覆盖自身,从那时起,person_1.fun将是一个属性值
请记住,在python中,函数/方法只有在用括号调用时才会执行。如果不使用括号表示,则求值结果不是函数的输出,而是表达式生成对函数本身的引用,该引用可以放在另一个变量或数据结构中,稍后再调用
为了说明这一点:
>>定义my_func():
... 打印('被调用')
... 返回42
...
>>>x=my_func#没有括号,x成为my_func的别名
>>>y=my_func()#括号表示实际执行
被叫
>>>y
42
>>>x
>>>x()#x是对my_func的引用,可以自己调用
被叫
42
>>>
在案例1中,构造函数调用fun(),其中有一行内容,可以用属性值覆盖自身。这令人困惑,而且不是一件好事,因为它令人困惑
在案例2中,您的fun方法不包括要覆盖自身的行,因此不会被覆盖
在案例3中,您从未实际调用过fun方法,因此它永远没有机会覆盖自身。如果用person_1.fun()调用它,即用括号调用,那么它将执行并覆盖自身,从那时起,person_1.fun将是一个属性值
请记住,在python中,函数/方法只有在用括号调用时才会执行。如果不使用括号表示,则求值结果不是函数的输出,而是表达式生成对函数本身的引用,该引用可以放在另一个变量或数据结构中,稍后再调用
为了说明这一点:
>>定义my_func():
... 打印('被调用')
... 返回42
...
>>>x=my_func#没有括号,x成为my_func的别名
>>>y=my_func()#括号表示实际执行
被叫
>>>y
42
>>>x
>>>x()#x是对my_func的引用,可以自己调用
# case 2
class Person:
def __init__(self, first, last):
self.first = first
self.last = last
self.fun()
def fun(self):
value = self.first + '---' + self.last
return value
person_1 = Person('A', 'B')
person_1.fun
---> <bound method Person.fun of <__main__.Person object at 0x7fd4f79168d0>>
# case 3
class Person:
def __init__(self, first, last):
self.first = first
self.last = last
def fun(self):
value = self.first + '---' + self.last
self.fun = value
return value
person_1 = Person('A', 'B')
person_1.fun
---> <bound method Person.fun of <__main__.Person object at 0x7fd4f797f390>>