property的使用
定义一个方法来设置和访问该属性,如下面代码所示,即使赋值为字符串也不会报错,它会直接访问属性,倒是代码的不安全。
这是因为我们把方法看作对象的接口,直接访问对象的属性是不安全的,或设计上不够灵活,但是使用调用方法在形式上不如直接访问属性简洁,但胜在安全。
"""
A.get_age() # 访问器
A.set_age() # 设置器
通过
A.age 访问
A.age = 20 设置
定义类AgeDemo
通过访问器访问年龄
通过设置器设置年龄
年龄不是int类型则主动抛出异常
"""
# class AgeDemo:
# def __init__(self,age):
# self.age = age
#
# # 访问
# def get_age(self):
# return self.age
#
# # 设置
# def set_age(self,age):
# if not isinstance(age, int):
# raise TypeError("TypeError")
#
# self.age = age
#
# a = AgeDemo(18)
# a.age = "20" # 直接访问属性
# print(a.age) # 20 str 直接访问属性 不安全
使用property可以触发错误,无法直接访问属性,先进入判断,不是int形式,就会报错。
# 当赋值的时候 直接触发set_age()方法
# class AgeDemo:
# def __init__(self,age):
# self.age = age
#
# # 访问
# def get_age(self):
# return self.age
#
# # 设置
# def set_age(self,age):
# if not isinstance(age, int):
# raise TypeError("TypeError")
# self.age = age
#
# age_pro = property(fget= get_age, fset= set_age)
#
# a = AgeDemo(18)
# a.age_pro = 20 # 赋值 --fset
# print(a.age_pro) # 访问 --fget 20
#
# a.age_pro = "22" # raise TypeError("TypeError")
# print(a.age_pro)
它还有另外一种使用方式:
class AgeDemo:
def __init__(self,age):
self.age = age
@property
def age_test(self):
return self.age
@age_test.setter
def age_test(self, age):
if not isinstance(age, int):
raise TypeError("TypeError")
self.age = age
a = AgeDemo(18)
a.age_test = 20
print(a.age_test)