@property的用法
阿新 • • 發佈:2017-06-03
使用 問題 integer return 不能 %d get ret class
實例的屬性有些是需要進行約束的,比如分數、年齡都需要是整形,而不能是浮點數類型,因此為了約束這些屬性的取值,可以在類的定義中定義賦值和取值函數,在賦值函數中對變量的取值進行約束,如下所示
class Student(object): def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError(‘score must be an integer!‘) if value < 0 or value > 100: raise ValueError(‘score must between 0 ~ 100!‘) self._score = value
但是這麽做每次對變量賦值都需要調用函數,能否不調用函數,而直接像使用屬性一樣取值賦值呢,答案是可以的,[email protected]
class Junior(object): def __init__(self, name, score, sex, height, weight): self.name = name self.score = score self.sex = sex self.height = height self.weight = weight @property def birth(self): return self._birth @birth.setter def birth(self,year): if not isinstance(year,int): raise valueerror(‘not integer‘) self._birth=year @property def age(self): return 2017-self._birth
s=Junior(‘kimi‘,96,‘M‘,180,65)
s.birth=1989
print(s.birth)
print(s.age)
上例中就可以將birth當做屬性來調用賦值,又可以對它進行約束,這個例子中birth屬於可讀可寫,[email protected],沒有setter,因此只是可讀,不能賦值。
作業:
class Screen(object): @property def width(self): return self._width @property def height(self): return self._height @width.setter def width(self,value): if not isinstance(value,int): raise error(‘not an integer‘) self._width=value @height.setter def height(self, value): if not isinstance(value, int): raise error(‘not an integer‘) self._height = value @property def resolution(self): self._resolution=self.width*self.height return self._resolution # test: s = Screen() s.width = 1024 s.height = 768 print(s.resolution) assert s.resolution == 786432, ‘1024 * 768 = %d ?‘ % s.resolution
取值和賦值函數內部的變量不能與函數名相同,一定要有所區分,不然會被認為是函數名,導致出問題,因此函數名為width,函數內部的變量名為self._width
@property的用法