Propety装饰器
把类的方法伪装成属性调用的方式,就是把类里面的一个函数,变成一个属性一样的东西~
一开始调用类的方法要使用圆括号,现在变成了属性进行读取设置存储。
举个例子来说明:
常用的调用方法
- class obj:
- def __init__(self,name,age):
- self.__name=name
- self.__age=age
- # 讲这些设置成私有变量
- def get_age(self):
- return self.__age
- def set_age(self,value):
- if isinstance(value,int):
- self.__age=value
- else:
- raise ValueError('非整数类型')
- def del_age(self):
- print 'delete over'
- a = obj('langzi',18)
- print a.get_age()
- a.set_age(20)
- print a.get_age()
使用装饰器
- class obj:
- def __init__(self,name,age):
- self.__name=name
- self.__age=age
- # 把这些设置成私有变量
- @property
- def age(self):
- return self.__age
- @age.setter
- def age(self,value):
- if isinstance(value,int):
- self.__age=value
- else:
- raise ValueError('非整数类型')
- @age.deleter
- def age(self):
- print 'delete over'
- a = obj('langzi',18)
- # 使用这些装饰器,可以使用类与对象的方法直接调用
- print a.age
- # 这里就是直接调用返回age的值
- a.age=20
- # 这里就是直接使用setter把值转换
- print a.age
- del a.age
- # 删除age
当然这种调用方法有些麻烦,每次都是一个一个去实例类与对象,有个更加简单直观的方法。
更加减半的使用property()函数
除了使用装饰器的方式将一个方法伪装成属性外,Python内置的builtins模块中的property()函数,为我们提供了第二种设置类属性的手段。
- class People:
- def __init__(self, name, age):
- self.__name = name
- self.__age = age
- def get_age(self):
- return self.__age
- def set_age(self, age):
- if isinstance(age, int):
- self.__age = age
- else:
- raise ValueError
- def del_age(self):
- print("删除年龄数据!")
- # 核心在这句
-
age = property(get_age, set_age, del_age, "年龄")
- obj = People("jack", 18)
- print(obj.age)
- obj.age = 19
- print("obj.age: ", obj.age)
- del obj.ag
通过语句age = property(get_age, set_age, del_age, “年龄”)将一个方法伪装成为属性。其效果和装饰器的方法是一样的。
property()函数的参数:
- 第一个参数是方法名,调用 实例.属性 时自动执行的方法
- 第二个参数是方法名,调用 实例.属性 = XXX时自动执行的方法
- 第三个参数是方法名,调用 del 实例.属性 时自动执行的方法
- 第四个参数是字符串,调用 实例.属性.__doc__时的描述信息。