在python中,属性的setter函数类似于重载赋值运算符,这样说对吗?

在python中,属性的setter函数类似于重载赋值运算符,这样说对吗?,python,Python,我刚开始研究python中的OOP主题,我遇到了一些麻烦,比如python中的decorators/properties和所有“私有”方法技巧 可以这样说吗,使用@property就像使用属性一样,但在幕后有一个函数可以做些什么?(例如,检查输入) 此外,正在使用@is_barking.setter类似于在其他语言(比如C++)中重载赋值运算符?因为我也可以检查输入和类似的东西 代码如下: class Dog(): 定义初始化(self,name): self.name=名称 @财产 def正在

我刚开始研究python中的OOP主题,我遇到了一些麻烦,比如python中的decorators/properties和所有“私有”方法技巧

可以这样说吗,使用@property就像使用属性一样,但在幕后有一个函数可以做些什么?(例如,检查输入)
此外,正在使用@is_barking.setter类似于在其他语言(比如C++)中重载赋值运算符?因为我也可以检查输入和类似的东西

代码如下:

class Dog():
定义初始化(self,name):
self.name=名称
@财产
def正在吠叫(自身):
尝试:
回归自我。你在吠叫
除AttributeError as错误外:
self.\u is\u barking=False
回归自我。你在吠叫
@你在叫塞特吗
def是_吠叫(自身,值):
self.\u是\u barking=值
def main():
雷克斯=狗(“雷克斯”)
打印(雷西正在吠叫)
rexi.is_barking=真的吗
打印(雷西正在吠叫)
main()
>>假的
>>真的
多谢各位

是的,有点正确。setter允许您仅截获对该属性名称的分配

它不会重载赋值,只需在运行时为赋值提供便利,
property
对象是数据描述符对象;他们可以拦截他们所属类实例上的所有属性访问(获取、设置和删除),因此可以否决任何这些操作。它不同于C++赋值重载,它在编译时(Irc)处理,在整个实例上运行,而不仅仅是实例上的属性。 实际发生的情况是,属性分配由类对象处理,该类对象的实例将属性分配给该类对象。该类将检查给定的属性名是否被类上的对象覆盖,该对象是具有or方法的描述符对象

因此,可以通过
\uuuu setattr\uuuu
特殊方法将常规属性分配连接到,Python将属性设置委托给父类型的实例:

# foo.attr = bar   -> Python essentially calls __setattr__ on the class 
type(foo).__setattr__(foo, "attr", bar)
在常规的,简单的情况下

foo.__dict__["attr"] = bar
但实际上,首先要在
type(foo)
及其父类上搜索数据描述符。如果存在此类对象,则其任务是处理属性设置:

obj = None
for cls in reversed(type(foo).__mro__):
    if "attr" in cls.__dict__:
        obj = cls.__dict__["attr"]
        break
if hasattr(obj, "__set__") or hasattr(obj, "__delete__"):  # data descriptor?
    try:
        obj.__set__(foo, bar)
    except AttributeError:
        raise AttributeError("can't set attribute")
else:
    foo.__dict__["attr"] = bar

property
对象实现
\uuuu set\uuuuu
,此实现将调用您的setter(如果已设置)。

是的,setter就是这么做的,拦截属性赋值。兄弟,我想答案比我在python中的水平略高。不过无论如何,谢谢,我会继续学习,希望我能达到这个水平:)@Ba2sik:别担心,在某个时候,你会想为什么不能设置
实例。uuu dict_uu[“propertyname”]
并显示它,然后你会记住这个答案,并重新学习数据描述符。:-)