python 属性相关的property(), @property,__setattr__,__getattr__

  1. _getattr_(self, item):

在访问对象的item属性的时候,如果对象并没有这个相应的属性,方法,那么将会调用这个方法来处理。
假如一个对象一个属性:cat.name = "tom",那么在访问cat.name的时候因为当前对象有这个属性,那么将不会调用__getattr__()方法,而是直接返回了拥有的name属性了

  1. _setattr_(self, item, value):

当试图对象的item特性赋值的时候将会被调用。

  1. 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
  1. @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
原文地址:https://www.cnblogs.com/amize/p/13255202.html