鱼C论坛

 找回密码
 立即注册
查看: 2200|回复: 2

[已解决]请教关于OOP的property的问题

[复制链接]
发表于 2023-3-11 18:28:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一段代码,摘自https://blog.csdn.net/geerniya/article/details/79933086,我不太理解为什么代码这样写却可以运行。
首先,我不理解为什么 在__init__那里self.sex 能被赋值。其次,我不理解 self.__sex 在哪里被赋值成 self.sex 。 最后我不理解为什么代码中那么多属性(是这样称呼吗)都可以叫sex,我用self.sex的时候用的是哪一条属性。
最佳答案
2023-3-11 18:43:59
1、在 __init__ 中,self.sex 能够被赋值是因为在 sex 属性的 setter 方法中,self.__sex 被赋值为传入的 value。

因此,在 __init__ 中,self.sex 实际上调用的是 sex 属性的 setter 方法,将传入的值赋给了 self.__sex。

2、在 __init__ 中,self.sex 被赋值后,self.__sex 也被赋值为同样的值。

这是因为 self.sex 调用的是 sex 属性的 setter 方法,而在 setter 方法中,self.__sex 被赋值为传入的 value。

3、代码中存在多个属性名为 sex,但它们之间是有区别的。

在 __init__ 中,self.sex 是一个普通的实例属性,用于初始化对象的性别属性。

而在 sex 属性的 getter, setter 和 deleter 方法中,sex 是一个 decorator,用于将这些方法绑定到 sex 属性上。

另外,self.__sex 是一个私有属性,用于存储对象的性别属性值,而不是直接暴露给外部访问。
截屏2023-03-11 18.12.21.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-11 18:43:59 | 显示全部楼层    本楼为最佳答案   
1、在 __init__ 中,self.sex 能够被赋值是因为在 sex 属性的 setter 方法中,self.__sex 被赋值为传入的 value。

因此,在 __init__ 中,self.sex 实际上调用的是 sex 属性的 setter 方法,将传入的值赋给了 self.__sex。

2、在 __init__ 中,self.sex 被赋值后,self.__sex 也被赋值为同样的值。

这是因为 self.sex 调用的是 sex 属性的 setter 方法,而在 setter 方法中,self.__sex 被赋值为传入的 value。

3、代码中存在多个属性名为 sex,但它们之间是有区别的。

在 __init__ 中,self.sex 是一个普通的实例属性,用于初始化对象的性别属性。

而在 sex 属性的 getter, setter 和 deleter 方法中,sex 是一个 decorator,用于将这些方法绑定到 sex 属性上。

另外,self.__sex 是一个私有属性,用于存储对象的性别属性值,而不是直接暴露给外部访问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-11 18:53:32 | 显示全部楼层
1. self.sex 是一个变量,当然可以被赋值。只不过是隶属于 self 的 sex 变量,所以被命名为 self.sex
2. self.__sex 和 self.sex 是两个不同的变量,只是前者无法通过正常手段从外部获取到。
3. 由于两个 sex 函数的定义前面都有装饰器( @property  、@sex.setter、@sex.deleter ),所以这个 sex 相当于只是被更改了多次。在把这个装饰器展开后就可以明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 07:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表