當前位置:首頁 » 編程語言 » pythongetattr

pythongetattr

發布時間: 2024-01-29 13:31:36

A. python 如何查看object有哪些屬性值

dir([obj]):
調用這個方法將返回包含obj大多數屬性名的列表(會有一些特殊的屬性不包含在內)。obj的默認值是當前的模塊對象。
hasattr(obj, attr):
這個方法用於檢查obj是否有一個名為attr的值的屬性,返回一個布爾值。
getattr(obj, attr):
調用這個方法將返回obj中名為attr值的屬性的值,例如如果attr為』bar』,則返回obj.bar。
setattr(obj, attr, val):
調用這個方法將給obj的名為attr的值的屬性賦值為val。例如如果attr為』bar』,則相當於obj.bar = val。

B. python類的屬性有哪幾種如何訪問它們

屬性的訪問機制

一般情況下,屬性訪問的默認行為是從對象的字典中獲取,並當獲取不到時會沿著一定的查找鏈進行查找。例如a.x的查找鏈就是,從a.__dict__['x'],然後是type(a).__dict__['x'],再通過type(a)的基類開始查找。

若查找鏈都獲取不到屬性,則拋出AttributeError異常。

一、__getattr__方法

這個方法是當對象的屬性不存在是調用。如果通過正常的機制能找到對象屬性的話,不會調用__getattr__方法。

classA:
a=1
def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)
#output
1
__getattr__call
b

二、__getattribute__方法

這個方法會被無條件調用。不管屬性存不存在。如果類中還定義了__getattr__,則不會調用__getattr__()方法,除非在__getattribute__方法中顯示調用__getattr__()或者拋出了AttributeError。

classA:
a=1
def__getattribute__(self,item):
print('__getattribute__call')
raiseAttributeError

def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)

所以一般情況下,為了保留__getattr__的作用,__getattribute__()方法中一般返回父類的同名方法:

def__getattribute__(self,item):
returnobject.__getattribute__(self,item)

使用基類的方法來獲取屬性能避免在方法中出現無限遞歸的情況。

三、__get__方法

這個方法比較簡單說明,它與前面的關系不大。

如果一個類中定義了__get__(),__set__()或__delete__()中的任何方法。則這個類的對象稱為描述符。

classDescri(object):
def__get__(self,obj,type=None):
print("callget")

def__set__(self,obj,value):
print("callset")

classA(object):
x=Descri()

a=A()
a.__dict__['x']=1#不會調用__get__
a.x#調用__get__
如果查找的屬性是在描述符對象中,則這個描述符會覆蓋上文說的屬性訪問機制,體現在查找鏈的不同,而這個行文也會因為調用的不同而稍有不一樣:

  • 如果調用是對象實例(題目中的調用方式),a.x則轉換為調用:。type(a).__dict__['x'].__get__(a, type(a))
  • 如果調用的是類屬性,A.x則轉換為:A.__dict__['x'].__get__(None, A)
  • 其他情況見文末參考資料的文檔

  • 四、__getitem__方法

  • 這個調用也屬於無條件調用,這點與__getattribute__一致。區別在於__getitem__讓類實例允許[]運算,可以這樣理解:
  • __getattribute__適用於所有.運算符;
  • __getitem__適用於所有[]運算符。
  • classA(object):

  • a=1


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnitem


  • t=A()

  • print(t['a'])

  • print(t['b'])

  • 如果僅僅想要對象能夠通過[]獲取對象屬性可以簡單的:

  • def__getitem(self,item):

  • returnobject.__getattribute__(self,item)

  • 總結

    當這幾個方法同時出現可能就會擾亂你了。我在網上看到一份示例還不錯,稍微改了下:

  • classC(object):

  • a='abc'


  • def__getattribute__(self,*args,**kwargs):

  • print("__getattribute__()iscalled")

  • returnobject.__getattribute__(self,*args,**kwargs)


  • #return"haha"

  • def__getattr__(self,name):

  • print("__getattr__()iscalled")

  • returnname+"fromgetattr"


  • def__get__(self,instance,owner):

  • print("__get__()iscalled",instance,owner)

  • returnself


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnobject.__getattribute__(self,item)


  • deffoo(self,x):

  • print(x)


  • classC2(object):

  • d=C()


  • if__name__=='__main__':

  • c=C()

  • c2=C2()

  • print(c.a)

  • print(c.zzzzzzzz)

  • c2.d

  • print(c2.d.a)

  • print(c['a'])

  • 可以結合輸出慢慢理解,這里還沒涉及繼承關系呢。總之,每個以__get為前綴的方法都是獲取對象內部數據的鉤子,名稱不一樣,用途也存在較大的差異,只有在實踐中理解它們,才能真正掌握它們的用法。

C. python自動化測試怎麼將多個依賴數據

介面測試中,有些場景介面間存在著數據依賴的問題,比如說提交訂單前需要用戶先登錄等等,下面就用兩個小案例說說數據依賴的問題。

兩個介面,一個介面(project_add)用來創建測試項目,一個介面(env_add)用來創建測試環境,env_add介面需依賴project_add介面返回的project_id欄位數據。

一、Postman解決數據依賴的問題

這樣數據依賴的問題就搞定了

二、用python代碼實現介面數據依賴

用代碼解決數據依賴的方法有多種,下面用反射來解決數據依賴的問題。

反射它可以把字元串映射到實例的變數或者實例的方法然後,可以去執行調用、修改等操作。

它有四個重要的方法:

getattr 獲取指定字元串名稱的對象屬性

setattr 為對象設置一個對象

hasattr 判斷對象是否有對應的對象(字元串)

delattr 刪除指定屬性

classRelyData(object):

project_id=Noneprint(RelyData.project_id)

setattr(RelyData,"project_id", "111")print(getattr(RelyData, "project_id"))

定義了一個RelyData()類,裡面設置了一個類屬性,project_id=None,然後再用setattr函數為對象RelyData裡面project_id屬性設置了新值,最後再用getattr函數取出裡面的值,這是個屬性值替換的過程。

classTest(unittest.TestCase):defsetUp(self):pass

deftest_1(self):"""添加項目介面"""url=
"http://127.0.0.1:8000/base/project_add/"headers= {'Content-Type':
'application/x-www-form-urlencoded'}

datas= {"prj_name": " search", "description": "網路搜索"}

response= requests.post(url, data=datas, headers=headers)print("response:", response.json())


D. 在Python中使用字元串調用函數

已有字元串形式的函數名稱,那麼如何調用這個函數呢?

通過調用內置函數locals()和globals()返回的字典對象,就可以可以獲得名稱與對象的映射關系。其中,locals()僅在全局范圍內調用時可以獲得函數對象。 我們來看以下的例子。

需要注意的是,使用上述方法通過字元串調用函數時,為了系統的安全,防止執行任意函數,需要對函數名做一些處理,也就是使用統一的前綴為這些函數命名。例如在上述例子中,使用前綴cmd_+函數名的形式定義函數(cmd_help,cmd_sum)。
在傳入函數名字元串時,只傳入函數名的後半部分(如"help","sum"),由程序添加前綴後組成完整的函數名,再調用該函數。

對於類的成員函數,則可以使用getattr()獲得類成員函數。

上述代碼通過字元串調用了類成員函數,與前一段代碼執行的結果相同。

此外,還可以使用字典將字元串與函數對應起來調用,缺點就是每增加一個函數需要相應在字典對象中添加相應的鍵值,增加代碼維護工作量。

以上代碼在Python 3.6以上運行通過。

E. 怎麼判斷 Python 對象是否包含某個屬性

頂級函數hasattr可以查看對象是否包含某某屬性,這里的屬性包括數據屬性和方法。getattr可以獲取屬性。

如下舉例說明。

a=[1,2,3]
print('列表有count屬性:%s'%hasattr(a,'count'))
print('列表有append屬性:%s'%hasattr(a,'append'))
print('列表有shift屬性:%s'%hasattr(a,'shift'))
print('列表的count屬性是方法:%s'%hasattr(getattr(a,'count'),'__call__'))
print('列表的append屬性是方法:%s'%hasattr(getattr(a,'append'),'__call__'))
classmyclass():
def__init__(self):
self.valattr=3
defmethod(self):
pass
mc=myclass()
print('myclass有valattr屬性:%s'%hasattr(mc,'valattr'))
print('myclass有method屬性:%s'%hasattr(mc,'method'))
print('myclass的valattr屬性是方法:%s'%hasattr(getattr(mc,'valattr'),'__call__'))
print('myclass的method屬性是方法:%s'%hasattr(getattr(mc,'method'),'__call__'))
熱點內容
旅遊青蛙安卓版如何下載 發布:2025-01-22 21:52:51 瀏覽:317
歐文5的配置是什麼 發布:2025-01-22 21:30:23 瀏覽:108
日誌存儲資料庫 發布:2025-01-22 21:30:07 瀏覽:474
gulp上傳cdn 發布:2025-01-22 21:27:34 瀏覽:203
emule文件夾 發布:2025-01-22 21:23:23 瀏覽:981
s7e什麼時候推送安卓7 發布:2025-01-22 21:20:59 瀏覽:203
狐狸的清白腳本分析 發布:2025-01-22 21:19:59 瀏覽:182
如何破解仿射密碼 發布:2025-01-22 21:13:53 瀏覽:81
百度視頻存儲 發布:2025-01-22 21:13:11 瀏覽:168
發吧傳媒源碼 發布:2025-01-22 21:07:52 瀏覽:953