python的getattr
㈠ python中的getattr(object,name)和object.name有什麼區別
正常情況下沒有什麼區別
但是如果name不是object的屬性,那麼區別就顯示出來了.
如果直接訪問一個不存在的屬性,那麼將會拋出AttributeError異常
而是用getattr則可以返回一個默認值
例如
getattr(obj,'sss','emtry')
如果obj存在sss屬性,則返回相關的值,否則默認返回一個'emtry'.
㈡ python __getattr__和__setattr__應該怎麼理解
__getattr__為內置方法,當使用點號獲取實例屬性時,如果屬性不存在就自動調用__getattr__方法
__setattr__當設置類實例屬性時自動調用,如j.name=5 就會調用__setattr__方法 self.[name]=5
因為這個類是從dict繼承來的,是dict的超類
所以 self[attr]=value 相當於調用dict的下標方法
與 a={} ; a[attr]=value意思一樣
㈢ python getattr()函數的問題
getattr給了你那個函數, 但是你並沒有調用它
應該寫成getattr(li, 'pop')()
㈣ Python中處理屬性的重要屬性和函數是什麼
處理屬性的重要屬性和函數
1、特殊屬性
__class__:對象所屬類的引用(即obj.__class__和type(obj)的作用相同)。Python中的某些特殊方法比如 __getattr__,只在對象的類中尋找,而不在實例中尋找。__dict__:一個映射,存儲對象或類的可寫屬性。__slots__:類可以定義這個屬性,限制實例有哪些屬性。
2、內置函數
dir([object]):列出對象的大多數屬性。getattr(object,name[,default]):從object對象中獲取name字元串對應的屬性。獲取的屬性可能來自對象所屬的類或超類。hasattr(object,name):若object對象中存在指定的屬性,或者能以某種方式(如繼承)通過object對象獲取指定的屬性,返回True。setattr(object,name,value):把object對象指定屬性的值設為value,前提是object對象能接受那個值。這個函數可能會創建一個新屬性,或者覆蓋現有的屬性。var([object]):返回object對象的__dict__屬性。
相關推薦:《Python視頻教程》
3、特殊方法
__delattr__(self,name):只要使用del語句刪除屬性,就會調用這個方法。__dir__(self):把對象傳給dir函數時調用,列出屬性。__getattr__(self,name):僅當獲取指定的屬性失敗,搜索過obj,Class和超類之後調用。__getattribute__(self,name):嘗試獲取指定的屬性時總會調用這個方法。不過尋找的屬性是特殊屬性或特殊方法時除外。為了防止無限遞歸,__getattribute__方法的實現要使用super().__getattribute__(obj,name)。__setattr__(self,name,value):嘗試設置指定的屬性時總會調用這個方法。點號和setattr內置函數會觸發這個方法。
相關推薦:
Python中的屬性和特性是什麼
㈤ python getattr 什麼時間調用
比如你從頁面上獲取了一個屬性名,你想獲取對象里對應的值,這時候就用到了。
m="attr"
classA(object):
def__init__(self):
self.attr="hi"
a=A()
printgetattr(a,m)
如果解決了您的問題請採納!
如果未解決請繼續追問!
㈥ python裡面 getCarlnfo方法
class TestMain: def __init__(self): print('TestMain:__init__')
self.a = 1
def __getattr__(self, item): print('TestMain:__getattr__') return 2
def __getattribute__(self, item): print('TestMain:__getattribute__') if item == 'c': raise AttributeError return 3
if __name__ == '__main__':
t = TestMain() print(t.a) print(t.b) print(t.c)
㈦ 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)
其他情況見文末參考資料的文檔
- 這個調用也屬於無條件調用,這點與__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為前綴的方法都是獲取對象內部數據的鉤子,名稱不一樣,用途也存在較大的差異,只有在實踐中理解它們,才能真正掌握它們的用法。
四、__getitem__方法
如果僅僅想要對象能夠通過[]獲取對象屬性可以簡單的:
總結
當這幾個方法同時出現可能就會擾亂你了。我在網上看到一份示例還不錯,稍微改了下:
㈧ python重載getattr陷入遞歸
你確定 代碼無異嗎?
classWrapMe(object):
def__init__(self,obj):
self.data=obj
㈨ python 中 getattr 使用 為什麼這樣報錯
正確的寫法為room = getattr(self, 'next').
你可以認為getattr向對象傳遞了一條名字叫做'next'的簡訊, 請求'next'的內容. 既然是簡訊, 那必須是字元串啦.
㈩ 請求高手幫我詳解一下Python中的getattr內置函數
getattr(obj,"property_name or method_name")
可以動態的獲取一個對象的屬性和方法.
比如,一個命令處理類有很多方法 do_create do_destroy do_list do_start do_stop,
那麼就可以這樣寫
def exec(self,command,args):
if hasattr(self,"do_"+command):
func=getattr(self,"do_"+command)
return func(args)
這樣你只要添加這個類的方法,就能直接擴充該類所支持的命令了(python內置的一個命令行解釋器模塊就是用的這個方式。)