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。



评论列表