1. 程式人生 > 其它 >Python @property介紹

Python @property介紹

  • 對於封裝來說:通過例項.例項屬性來訪問例項的例項屬性是不建議這麼操作的
  • 正常情況下,例項的屬性應該是隱藏的,只能通過類下的例項方法來間接訪問
class Students:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_name(self):
        return self.__name

    def set_name(self,new_name):
        self.__name = new_name
		
s1 = Students('周杰倫',42)
print(s1.get_name())
s1.set_name('劉若英')
print(s1.get_name())
  • 正常情況下,當我們定義了一個class,建立了一個class的例項後,我們可以給該例項繫結任何屬性和方法,為了達到限制的目的,Python允許在定義class的時候,定義一個特殊的slots變數,來限制該class例項能新增的屬性

  • property 作用是把例項方法,變成屬性一樣呼叫,即原本是例項.方法()變成例項.屬性一樣使用;另外還可以對例項屬性進行限制,如屬性只可讀(有可讀,可寫,可刪除)

  • 首先需要例項化property

class Students:
    def __init__(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self,new_name):
        self.__name = new_name

    name = property(fget=get_name,fset=set_name,doc='測試property')



print(Students.name.__doc__)
s1 = Students('周杰倫')
print(s1.name)
  • 基本格式:屬性名 = property(fget=None, fset=None, fdel=None, doc=None)
    fget:用於獲取屬性的方法
    fset:用於設定屬性的方法
    fdel:用於刪除屬性的方法
    doc:屬性的說明文件字串

  • 初始化引數不是必填,不填就預設為None,填了就代表屬性具體哪些許可權

  • 還有一種更簡單的方法實現上面的功能,就是直接使用裝飾器,如@property(代表只讀), @name.setter(代表可寫),@name.deleter(代表可刪除)

  • 此時方法名字就需要一致(因為代表的是一個屬性,一個屬性不可能有多個名字),另外這個名字不能和類裡的其他屬性名稱一樣,否則會報錯

class Students:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, new_name):
        self.__name = new_name


s1 = Students('周杰倫')
print(s1.name)
s1.name = 'JAY'
print(s1.name)
  • 可以看出例項s1,原本(name的例項方法變成了屬性一樣的呼叫方式)