Python中的@property,@setter

137 阅读2分钟

@property的简单用法

  • @property 可以将一个方法的调用方式变成属性调用
#测试@property,简化的用法

class Employss:

    @property
    def salary(self):
        print("salary")
        return 10000

emp1 = Employss()
# emp1.salary()   使用@property装饰后可以直接用下面方法调用
print(emp1.salary)

使用场景:

假定一个使用场景,先用函数方法解决
  • 定义一个简单的新类,此时可以正常使用。假如把 s1.salary当作用户输入项,薪资没有复数,就需要增加一些限制条件。
class Emp():
    def __init__(self,name,salary):
        self.name = name
        self.salary = salary

s1 = Emp("YHK",20000)

print(s1.salary)

s1.salary = -20000

print(s1.salary)
  • 首先在 self.name 和 self.salary 前面增加 __ 设为不可直接访问:这时就无法直接调用s1.__salary
class Emp():
    def __init__(self,name,salary):
        self.__name = name
        self.__salary = salary

s1 = Emp("YHK",20000)

print(s1.salary)

s1.salary = -20000

print(s1.salary)

更改为:

class Emp():
    def __init__(self,name,salary):
        self.__name = name
        self.__salary = salary
    
    #设置读取salsary的方法
    def get_salary(self):
        return self.__salary
    
    #设置更改salsary的方法,并且增加规则
    def set_salary(self,salary):
        if 1000<salary<50000:
            self.__salary = salary
        else:
            print("请输入正确的值")

s1 = Emp("YHK",20000)

print(s1.get_salary())

s1.set_salary(-20000)

print(s1.get_salary())

s1.set_salary(30000)

print(s1.get_salary())

输出结果依次为:

  1. 20000 #读取成功s1赋值
  2. 请输入正确的值 #设置数据不符合条件
  3. 20000 #数据未修改,返回之前保留的值
  4. 30000 #修改成功

使用@property 替代get_salary和set_salary函数

class Emp():
    def __init__(self,name,salary):
        self.__name = name
        self.__salary = salary

    @property
    def salary(self):
        return self.__salary

    @salary.setter
    def salary(self,salary):
        if 1000 < salary < 50000:
            self.__salary = salary
        else:
            print("请输入正确的值")

s1 = Emp("YHK",20000)

print(s1.salary)

s1.salary = -20000

print(s1.salary)

s1.salary = 30000

print(s1.salary)

调用方式发生了变化,但结果是一致的

输出结果依次为:

  1. 20000 #读取成功s1赋值
  2. 请输入正确的值 #设置数据不符合条件
  3. 20000 #数据未修改,返回之前保留的值
  4. 30000 #修改成功