對(duì)實(shí)例屬性的獲取和訪問恭朗,我們希望增加一些額外的處理過程才菠,比如說檢查類型或者驗(yàn)證。
要定義對(duì)屬性的訪問针史,一種簡單的方式是將其定義為property晶伦。
傳統(tǒng)方法
class Person(object):
def __init__(self, age):
self.__age = age
def get_age(self):
return self.__age
def set_age(self, age):
if not isinstance(age, int) or age < 0:
raise ValueError("age ust be int")
self.__age = age
c = Person(100)
print(c.age) # 報(bào)錯(cuò) 不能這樣訪問
print(c.get_age()) # 100,訪問方式比較繁瑣
方法一(已經(jīng)存在get和set方法的 + )
class Person1(object):
def __init__(self, age):
self.__age = age
def get_age(self):
return self.__age
def set_age(self, age):
if not isinstance(age, int) or age < 0:
raise ValueError("age ust be int")
self.__age = age
# 增加這一句
age = property(get_age, set_age)
a = Person1(100)
print(a.age) # 100 可以直接訪問啄枕,不用調(diào)用方法
print(a.get_age()) # 100 這樣調(diào)用方法也可以訪問
a.age = 9
print(a.age) # 9
方法二
class Person2(object):
def __init__(self, age):
self.__age = age
@property # 增加property裝飾器
def age(self):
return self.__age
@age.setter # 增加age.setter裝飾器
def age(self, age):
if not isinstance(age, int) or age < 0:
raise ValueError("age ust be int")
self.__age = age
# 注意使用這種方法的時(shí)候婚陪,都是使用age方法
a = Person2(100)
print(a.age) # 100
a.age = 88
print(a.age) # 88
a.age = -8
print(a.age) # 報(bào)錯(cuò)
property也可以用來定義需要計(jì)算的屬性,這類屬性并不會(huì)實(shí)際保存起來射亏,二時(shí)根據(jù)需要完成計(jì)算
import math
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return math.pi * self.radius ** 2
@property
def perimeter(self):
return 2 * math.pi * self.radius
c1 = Circle(5)
print(c1.radius)
print(c1.area)
print(c1.perimeter)