python 属性相关的property(), @property,__setattr__,__getattr__
- _getattr_(self, item):
在访问对象的item属性的时候,如果对象并没有这个相应的属性,方法,那么将会调用这个方法来处理。
假如一个对象一个属性:cat.name = "tom",那么在访问cat.name的时候因为当前对象有这个属性,那么将不会调用__getattr__()方法,而是直接返回了拥有的name属性了
- _setattr_(self, item, value):
当试图对象的item特性赋值的时候将会被调用。
- property() 函数
- 语法:
- property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
- 说明:
- fget 是获取属性值的方法。
- fset 是设置属性值的方法。
- fdel 是删除属性值的方法。
- doc 是属性描述信息。如果省略,会把 fget 方法的 docstring 拿来用(如果有的话)
class Student:
def __init__(self):
self._age = None
def get_age(self):
print('获取属性时执行的代码')
return self._age
def set_age(self, age):
print('设置属性时执行的代码')
self._age = age
def del_age(self):
print('删除属性时执行的代码')
del self._age
age = property(get_age, set_age, del_age, '学生年龄')
student = Student()
# 查看属性的文档字符串:学生年龄
print('查看属性的文档字符串:' + Student.age.__doc__)
# 设置属性
student.age = 18
# 获取属性
print('学生年龄为:' + str(student.age))
# 删除属性
del student.age
- @property 装饰器
- 被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做属性名。
- 被 @属性名.setter 装饰的方法是设置属性值的方法。
- 被 @属性名.deleter 装饰的方法是删除属性值的方法。
class Student:
def __init__(self):
self._age = None
@property
def age(self):
print('获取属性时执行的代码')
return self._age
@age.setter
def age(self, age):
print('设置属性时执行的代码')
self._age = age
@age.deleter
def age(self):
print('删除属性时执行的代码')
del self._age
student = Student()
# 设置属性
student.age = 18
# 获取属性
print('学生年龄为:' + str(student.age))
# 删除属性
del student.age