gpt4 book ai didi

python - 为什么Class property.setter不是方法重载的情况?

转载 作者:行者123 更新时间:2023-11-30 22:18:06 24 4
gpt4 key购买 nike

Python 中不可能重载方法!你能解释一下为什么Python中的Properties.setter不是方法重载的情况吗?

class newOne():
def __init__(self):
self.__x = 0
@property
def val(self):
return self.__x
@val.setter
def val(self,value):
self.__x = value

在上面的代码中,我有两个具有相同名称“val”(但参数集不同)的方法,并且两者的行为不同。

最佳答案

这不是方法重载,因为没有可以调用两个具有不同签名的方法。如果是方法重载,你可以这样做:

obj = newOne()

print(obj.val())
obj.val(5)

但这不起作用,因为 valproperty而不是重载方法。

<小时/>

那么那里发生了什么?为什么我们要定义两个同名的方法?如果不重载,它们会发生什么?

神奇的事情发生在装饰器中。作为先决条件,您必须知道

@deco
def func(...):
...

相当于

def func(...):
...

func = deco(func)

因此,首先发生的事情是 @property 装饰器将您的 getter 函数转换为一个属性,并以该函数作为其 getter 函数:

class newOne:
@property
def val(self):
return self.__x

print(newOne.val)
print(newOne.val.fget)
# output:
# <property object at 0x002B1F00>
# <function newOne.val at 0x0052EAE0>

此后,@val.setter 装饰器创建一个带有 getter 和 setter 函数的新属性:

class newOne:
@property
def val(self):
return self.__x

@val.setter
def val(self, value):
self.__x = value

print(newOne.val)
print(newOne.val.fget)
print(newOne.val.fset)
# output:
# <property object at 0x0221B7B0>
# <function newOne.val at 0x0226EB70>
# <function newOne.val at 0x0226EAE0>

(getter 和 setter 函数具有相同的名称,因为它们都定义为 def val(...),但它们仍然是不同的函数。那就是为什么他们有不同的 id。)

所以最后你有一个带有 getter 和 setter 函数的 val 属性。您没有有重载方法。

有关属性如何工作以及如何调用 getter 和 setter 函数的详细信息,请参阅 descriptor documentation .

关于python - 为什么Class property.setter不是方法重载的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49457035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com