1. 程式人生 > >@property的用法

@property的用法

使用 問題 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的用法