属性的设置
# 定义一个名为Student的类
class Student:
# __init__方法是类的构造函数,用于初始化新创建的对象
def __init__(self,name,gender):
# self.name是对象的公开属性,用于存储学生的名字
self.name=name
# self.__gender是对象的私有属性,用于存储学生的性别,前面的双下划线表示它是私有的
self.__gender=gender
# 使用@property装饰器将gender方法转换为只读属性
# 使用@property 修改方法,将方法转成属性使用
# 这意味着你可以通过对象.gender来获取性别,但不能直接设置它(除非定义了setter)
@property
def gender(self):
# 当访问gender属性时,实际上执行的是这个方法,它返回私有属性__gender的值
return self.__gender
# 使用@gender.setter装饰器为gender属性定义一个setter方法
# 将gender这个属性设置为可写属性
# 这允许你通过对象.gender = value来设置性别
@gender.setter
def gender(self,value):
# 这里是一个条件判断,如果传入的性别不是'nan'(可能代表男)也不是'nv'(可能代表女)
if value!='nan' and value!='nv':
# 打印一条消息说性别有误,并将性别设置为'nan'(这里可能是一个逻辑错误,因为通常我们期望有一个明确的默认性别)
print('性别有误,已将性别设置为男')
self.__gender='nan'
else:
# 如果传入的性别是'nan'或'nv',则直接设置私有属性__gender的值
self.__gender=value
# 创建一个Student对象,名字是'cmm',性别是'nv'
stu=Student('cmm','nv')
# 打印学生的名字和性别,这会调用gender属性的getter方法
print(stu.name,stu.gender) #stu.gender就会去执行stu.gender()
# 尝试修改学生的性别为'qita'
#stu.gender='nan' #AttributeError: can't set attribute
# 由于'qita'不是'nan'也不是'nv',所以setter方法会打印一条消息,并将性别设置为'nan'
stu.gender='qita'
# 再次打印学生的名字和性别,这会显示性别已被修改为'nan'
print(stu.name,stu.gender)
解释
- 实例属性:在
__init__
方法中,self.name
和self.__gender
被设置为实例属性。self.name
是公开的,而self.__gender
是以双下划线开头的,这表示它是一个私有属性。私有属性在类外部无法直接访问或修改(尽管通过一些技巧还是可以访问,但这不是推荐的做法)。 @property
装饰器:这个装饰器用于将一个方法转换为相同名称的只读属性。在你的例子中,@property
装饰了gender方法,这意味着当你尝试访问stu.gender
时,实际上是在调用gender(self)
方法,并返回其结果。@<property_name>.setter
装饰器:这个装饰器用于定义一个设置器(setter),它允许你修改由@property
装饰的属性。在你的例子中,@gender.setter
装饰了另一个名为gender
的方法,这个方法接受一个参数value
,用于设置私有属性self.__gender
的值。- 性别验证逻辑:在你的
gender
设置器中,有一个简单的验证逻辑。如果传入的性别值不是'nan'
(代表男)或'nv'
(代表女),则会打印一条消息,并将性别设置为'nan'
(这里似乎有一个逻辑错误,因为按照代码的意图,如果输入不是预期的性别,应该设置为默认性别,但默认性别的值被硬编码为'nan'
,这可能是一个笔误或遗漏)。如果传入的性别是有效的,则直接设置私有属性self.__gender
。
注意事项
- 私有属性
__gender
前面有两个下划线,这意味着它只能在Student
类内部被访问和修改。外部代码不能直接访问__gender
,但可以通过gender
属性的getter和setter方法来间接访问和修改它。 @property
装饰器用于将gender
方法转换为一个只读属性。这意味着当你尝试访问stu.gender
时,Python会调用gender
方法并返回其结果,而不是让你直接访问__gender
属性。@gender.setter
装饰器用于为gender
属性定义一个setter方法。这允许你通过赋值操作(如stu.gender = 'some_value'
)来设置性别。在这个setter方法中,你可以添加自定义的逻辑来处理性别值的设置。- 在setter方法中,有一个逻辑判断:如果传入的性别值不是'nan'也不是'nv',则打印一条消息并将性别设置为'nan'。这可能是一个逻辑错误,因为通常我们期望在传入无效性别时有一个明确的默认性别设置(比如'unknown'),并且打印的消息应该与实际设置的值一致。在这个例子中,打印的消息说“已将性别设置为男”,但实际上代码将性别设置为了'nan'。
输出
cmm nv
性别有误,已将性别设置为男
cmm nan
仅供参考)
Comments NOTHING