1.简介
‘property’是一种特殊的函数装饰器,用于实现类的属性访问控制
它提供了一种更加简单和方便的方式来访问和修改对象的属性
2使用过程
1.当我在一个类中使用“property”装饰器来定义一个属性时,它实际上会生成三个方法
1.一个获取给属性的值
2.一个用于设置该属性的值
3.以及删除该属性的值
这些方法的名称都是我们在使用“property”装饰器时所指定的属性名称
具体地说
1.当我们通过实例访问该属性,会自动调用'getter'方法来获取属性的值
2.当我们对这个属性进行赋值时,会自动调用“setter”方法来设置属性的值
3.当我我们使用“del”关键字 删除这个属性时,会自动调用“deleter”方法来删除这个属性
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
print('getting name')
return self._name
@name.setter
def name(self, value):
print('setting name to ', value)
self._name = value
@name.deleter
def name(self):
print('deleting name')
del self._name
p = Person('Alice')
print(p.name)
p.name = 'Bob'
del p.name
需要注意:我们在类中使用’property‘装饰器来定义一个属性时,实际上是定义了一个名为’name‘的方法,而不是一个真正的属性
使用@property不使用@property.getter是因为@property.getter=@property.getter.getter,@property已经含有.getter方法了无须重复
在Python中,属性访问类似于Java中的"访问器方法"(accessor method),也就是getter和setter方法。在Python中,我们可以通过定义属性来控制对对象属性的读写操作,这些属性本质上是方法,可以使用@property装饰器将其定义为getter方法,并使用@<property_name>.setter装饰器来定义setter方法。
class Person: def __init__(self, age): self._age = age @property def age(self): return self._age @age.setter def age(self, value): if value < 0: raise ValueError("Age cannot be negative") self._age = value
在这个例子中,我们定义了一个名为"age"的属性,它具有一个getter方法和一个setter方法。getter方法返回实例变量"_age"的值,而setter方法验证传递给它的值是否大于等于0,如果小于0,则抛出ValueError异常,否则将其赋值给"_age"变量。
通过这种方式,我们可以控制对"age"属性的读写操作,并确保只有有效的值被设置为属性的值。这种属性访问的方式与Java中的访问器方法非常相似,因为它们都采用了类似的语法和模式。