python類屬性用法總結


屬性的定義: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__     )
結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM