Python中@property的介绍与使用
由于 Python 语言具有灵活简洁的语法,总能使用一些奇技淫巧来重新装饰一下传统的做法,这种奇技淫巧被称为语法糖,使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
使用@property
我们定义一个类的属性,但是我们要求属性值必须是某个类型或者符合某种条件,这样的话我们每次对该属性进行写的时候, 都要进行检查,这样非常繁琐。
class Human(object): def __init__(self, age=0): self.age = age ruhua = Human() age = input("请调整如花的年龄:") try: age = int(age) if age < 0: print("年龄不能为负数,年龄调整失败") else: ruhua.age = age except: print("请输入整数,年龄调整失败") print(ruhua.age)
在面向对象编程中,我们习惯于把这些类型检查或条件检查逻辑放在类中,然后给属性赋予私有特性(防止在类的外部写该属性还要自己写检查), 我们常用的做法是自己写一个 set 函数进行写属性操作,get 函数进行读属性操作。
class Human(object): def __init__(self, age=0): self.__age = age def setage(self, age): try: age = int(age) if age < 0: print("年龄不能为负数,年龄调整失败") else: ruhua.__age = age except: print("请输入整数,年龄调整失败") def getage(self): return self.__age ruhua = Human() age = input("请调整如花的年龄:") ruhua.setage(age) print(ruhua.getage())
把属性设置私有的,让用户通过 get 和 set 来访问属性,这样显然不符合我们 python 语言的高大上的特质, 如果我们能做到把函数变成属性,在访问属性时就是调用函数,这样在函数中我们可以做参数类型检查和条件检查, 就如属性自己做检查一样,Python 提供 @property 关键字可以把函数变成属性。
class Human(object): def __init__(self, age=0): self.__age = age @property def age(self): return self.__age @age.setter def age(self, age): try: age = int(age) if age < 0: print("年龄不能为负数,年龄调整失败") else: ruhua.__age = age except: print("请输入整数,年龄调整失败") ruhua = Human() age = input("请调整如花的年龄:") ruhua.age = age print(ruhua.age)
本节重要知识点
要知道传统的做法 get 和 set 的由来。
会灵活使用 @property。
评论列表