歡迎您光臨本站 註冊首頁

什麼是python類屬性

←手機掃碼閱讀     retouched @ 2020-06-12 , reply:0

首先我們來看一下屬性的定義

屬性的定義:python中的屬性其實是普通方法的衍生。

操作類屬性有三種方法:

1.使用@property裝飾器操作類屬性。

2.使用類或實例直接操作類屬性(例如:obj.name,obj.age=18,del obj.age)

3.使用python內置函數操作屬性。

屬性存在的意義:

1、訪問屬性時可以製造出和訪問字段完全相同的假象,屬性由方法衍生而來,如果Python中沒有屬性,方法完全可以代替其功能。

2、定義屬性可以動態獲取某個屬性值,屬性值由屬性對應的方式實現,應用更靈活。

3、可以制定自己的屬性規則,用於防止他人隨意修改屬性值。

下面詳細介紹三種操作類屬性的方法:

1.使用@property裝飾器操作類屬性。

定義時,在普通方法的基礎上添加@property裝飾器;屬性僅有一個self參數,調用時無需括號;

優點:

1) @property裝飾器可以實現其他語言所擁有的getter,setter和deleter的功能(例如實現獲取,設置,刪除隱藏的屬性)

2) 通過@property裝飾器可以對屬性的取值和賦值加以控制,提高代碼的穩定性。

實例代碼1:

  #encoding=utf-8   class Goods(): #新式類   @property   def price(self): #查看屬性值    print ('@property ')    @price.setter #修改、設置屬性    def price(self, value):    print ('@price.setter' )    @price.deleter#刪除屬性   def price(self):    print ('@price.deleter')      obj = Goods(50)   obj.price# 自動執行 @property 修飾的 price 方法,並獲取方法的返回值   obj.price = 2000 # 自動執行 @price.setter 修飾的 price 方法,並將2000賦值給方法的參數  del obj.price # 自動執行 @price.deleter 修飾的 price 方法   結果輸出:  @property  @price.setter  @price.deleter

 

實例代碼2:通過@property裝飾器對屬性的取值和賦值加以控制

  class Goods(object):    def __init__(self):      self.value=50    @property    def price(self): # 查看屬性      return self.value       @price.setter # 添加或設置屬性(屬性名.setter)    def price(self, value):      if value >=50 and value<=100: #對屬性的取值和賦值加以控制        self.value=value        print (self.value)      else:        print ("請輸入一個50到100之間的數!")       @price.deleter # 刪除屬性(屬性名.deleter) 注意:屬性一旦刪除,就無法設置和獲取    def price(self):      del self.value      print ("price is deleted!")     obj = Goods()  print (obj.price)  # 自動執行 @property 修飾的 price 方法,並獲取方法的返回值  obj.price=106   # 自動執行 @price.setter 修飾的 price 方法,並將106 賦值給方法  del obj.price   # 自動執行 @price.deleter 修飾的 price 方法  結果輸出:  50  請輸入一個50到100之間的數!  price is deleted!

 

實例擴展:

  class Dog(object):       name = 'dog'       def init(self):        self.age = 18     d1 = Dog()    d2 = Dog()

 

這裡有兩個實例 d1,d2 吧。

  d1.name # 輸出 dogd2.name # 輸出 dogd1.name = 'abc'  d1.name # 輸出 abcd2.name # 輸出 dogDog.name # 輸出 dog

 

原因是 d1.name 輸出 dog 不是因為這個實例共享了類屬性,而是因為這個實例沒有 dog 屬性,所以 python 查找了類屬性。但是一旦你修改了 d1.name 相當於給 d1 實例綁定了 name 屬性之後,d1.name 就與類屬性無關了。既然這樣就談不上實例之間共享類屬性了,因為只要一賦值,就相當於綁定了屬性,則上述 d1.name 的含義和 d2.name 的含義就不同了,它們的值也不同,很明顯它們的數據沒有共享。

 


[retouched ] 什麼是python類屬性已經有225次圍觀

http://coctec.com/docs/python/shhow-post-238265.html