返回顶部

请叫我杨先生

导航

Python @property 修饰器

@property 修饰器

把类的方法伪装成属性调用的方式,就是把类里面的一个函数,变成一个属性一样的东西~一开始调用类的方法要使用圆括号,现在变成了属性进行读取设置存储。举个例子来说明:

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)
a.set_age(20)

关键字raise是用来抛出异常的,一旦抛出异常后,后续的代码将无法运行。这实际上的将不合法的输出直接拒之门外,避免黑客通过这种试探找出我们程序的运行机制,从而找出漏洞,获得非法权限。

稍稍修改下代码,使用property装饰器

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(name="qq",age=11) 
print("before:",a.age)  # 使用这些装饰器,可以使用类与对象的方法直接调用 : a.age 
a.age = 110  # 这里就是直接使用setter把值转换
print("after:",a.age) 
del a.age 

更加简便的使用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.age

通过语句age = property(get_age, set_age, del_age, “年龄”)将一个方法伪装成为属性。其效果和装饰器的方法是一样的。

property()函数的参数:

第一个参数是方法名,调用 实例.属性 时自动执行的方法
第二个参数是方法名,调用 实例.属性 = XXX时自动执行的方法
第三个参数是方法名,调用 del 实例.属性 时自动执行的方法
第四个参数是字符串,调用 实例.属性.__doc__时的描述信息。

posted on 2021-12-28 21:09  YangShusen'  阅读(69)  评论(0编辑  收藏  举报