屬性的定義: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!
2.使用類或實例直接操作類屬性
缺點:對類的屬性沒有操作控制規則,容易被人修改。
#coding=utf-8 class Employee (object): #所有員工基類 empCount = 0 def __init__(self, name, salary) : #類的構造函數 self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self) : #類方法 print ("total employee ",Employee.empCount) def displayEmployee(self) : print ("name :",self.name , ", salary :", self.salary) #創建Employee類的實例對象 emp1 = Employee("麗麗", 10000) emp1.displayCount() emp1.displayEmployee() emp1.salary = 20000 #修改屬性 salary print (emp1.salary) emp1.age = 25 #添加屬性 age print (emp1.age) del emp1.age #刪除 age屬性 emp1.empCount=100 Employee.empCount=1000
結果:
total employee 1
name : 麗麗 , salary : 10000
20000
25
3.使用python內置函數操作屬性。
1)getattr(obj, name[, default]):訪問對象的屬性,如果存在返回對象屬性的值,否則拋出AttributeError異常。
2)hasattr(obj,name):檢查是否存在某個屬性,存在返回True,否則返回False。
3)setattr(obj,name,value):設置一個屬性。如果屬性不存在,會創建一個新屬性,該函數無返回值。若存在則更新這個值。
4)delattr(obj, name):刪除屬性,如果屬性不存在則拋出AttributeError異常,該函數也無返回值。
應用實例:
#encoding=utf-8 class Employee(object): #所有員工基類 empCount=0 def __init__(self,name,age,salary): #類的構造函數 self.name=name self.salary=salary self.age=age Employee.empCount+=1 def displayCount(self): #類方法 print("total employee",Employee.empCount) def displayEmployee(self): print("name:",self.name,"age:",self.age,",salary:",self.salary) #創建Employee類的實例對象 emp1=Employee("Rose",27,20000) #判斷實例對象是否存在某個屬性,存在返回True,否則返回False if hasattr(emp1,'name'): name_value=getattr(emp1,'name') #獲取name屬性值 print( "name的屬性值為:",name_value) else: print ("員工屬性不存在") #給實例添加一個屬性 if hasattr(emp1,'tel'): print ("員工屬性已存在") else: setattr(emp1,'tel','17718533234') t1=getattr(emp1,'tel') print("tel的屬性值為:",t1) setattr(emp1,'tel','15042622134') t2=getattr(emp1,'tel') print("tel修改后的屬性值為:",t2) #給實例刪除一個屬性 if hasattr(emp1,'age'): delattr(emp1,'age') else: print ("員工tel屬性不存在") #驗證屬性是否刪除成功 if hasattr(emp1,'age'): print( "屬性age存在!") else: print ("屬性age不存在!")
結果:
name的屬性值為: Rose
tel的屬性值為: 17718533234
tel修改后的屬性值為: 15042622134
屬性age不存在!
此外還有Python內置類屬性,這里做簡單介紹:
__dict__ : 類的屬性(獲取類所有信息):結果返回一個字典包含類屬性及屬性值,類方法等所有類信息
__doc__ :類的文檔字符串,也就是類的幫助信息。
__name__: 類名
__module__: 類定義所在的模塊 如果在當前模塊返回’__main__’; 如果類位於一個導入模塊mymod中,那么className.__module__ 等於 mymod)
__bases__ : 類的所有父類(包含了所有父類組成的元組)
實例代碼:
#coding=utf-8 class Employee (object): """所有員工的基類""" empCount = 0 def __init__(self, name, salary) : #類的構造函數 self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self) : #類方法 print ("total employee ",Employee.empCount ) def displayEmployee(self) : print ("name :",self.name , ", salary :", self.salary) print ("Employee.__doc__:", Employee.__doc__ ) print ("Employee.__name__:", Employee.__name__ ) print ("Employee.__module__:", Employee.__module__ ) print ("Employee.__bases__:", Employee.__bases__ ) print ("Employee.__dict__:", Employee.__dict__ )
結果: