酷酷的枪手 发表于 2023-3-11 18:28:02

请教关于OOP的property的问题

这是一段代码,摘自https://blog.csdn.net/geerniya/article/details/79933086,我不太理解为什么代码这样写却可以运行。
首先,我不理解为什么 在__init__那里self.sex 能被赋值。其次,我不理解 self.__sex 在哪里被赋值成 self.sex 。 最后我不理解为什么代码中那么多属性(是这样称呼吗)都可以叫sex,我用self.sex的时候用的是哪一条属性。

isdkz 发表于 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 是一个私有属性,用于存储对象的性别属性值,而不是直接暴露给外部访问。

tommyyu 发表于 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 相当于只是被更改了多次。在把这个装饰器展开后就可以明白了。
页: [1]
查看完整版本: 请教关于OOP的property的问题