Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Python类_uinit_uuu内调用函数既可以是属性也可以是方法?_Python_Python Class - Fatal编程技术网

为什么在Python类_uinit_uuu内调用函数既可以是属性也可以是方法?

为什么在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

我对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
        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>>