1. 程式人生 > >python 學習彙總62:class類特性property(初級學習- tcy)

python 學習彙總62:class類特性property(初級學習- tcy)

類特性property             2018/8/9

===================================================================
1.特性只對例項方法有效,對於靜態方法、類方法都無法使用

class Person(object):
   def get_age(self):     #新增類的新屬性
        return self._age
   def set_age(self, value):
       if not isinstance(value, int):
           raise ValueError('age must be an integer!')
       if value < 0 or value > 100:
           raise ValueError('age must between 0 ~ 100!')
       self._age = value

s = Person()
s.set_age(60)        # 檢查引數
print(s.get_age() ) #60
==================================================================

class Person(object):
   @property        #getter方法變成屬性@property等同age = property(fget=age)
   def age(self):
       return self._age

   @age.setter      #把一個setter方法變成屬性賦值
   def age(self, value):
       if not isinstance(value, int):
           raise ValueError('age must be an integer!')
       if value < 0 or value > 100:
           raise ValueError('age must between 0 ~ 100!')
       self._age = value

s = Person()
s.age = 60  # OK,實際轉化為s.set_age(60)
print(s.age) # OK,實際轉化為s.get_age()

==================================================================
#舊版定義
class foo(object):
    def getname(self):
       return self.__name
    def setname(self,value):
       if not isinstance(value,str):
           raise TypeError('must be a str')
       self.__name=value
    def delname(self):
        raise TypeError("Can't delete name")

    name=property(getname,setname,delname)
==================================================================
2.特性的繼承
2.1.完全重寫父類property
    #在子類中重新定義一個同名的getter函式,再加上@propety裝飾器即可。
class Student(Person):
    @property
    def age(self):
        return self._age

2.2. 重寫父類property的某些方法
class Girl(Person):
    @property
    def age(self):
        return super().age
    @age.setter
    def age(self, value):
        super(Girl, Girl).age.__set__(self, value)