當前位置:首頁 » 編程語言 » python的getattr

python的getattr

發布時間: 2022-04-21 04:20:12

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)
  • 其他情況見文末參考資料的文檔

  • 四、__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為前綴的方法都是獲取對象內部數據的鉤子,名稱不一樣,用途也存在較大的差異,只有在實踐中理解它們,才能真正掌握它們的用法。

㈧ 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內置的一個命令行解釋器模塊就是用的這個方式。)

熱點內容
cvr網路存儲 發布:2025-01-24 17:24:52 瀏覽:415
腿套壓縮襪 發布:2025-01-24 17:05:16 瀏覽:458
電腦如何將安卓軟體卸載干凈 發布:2025-01-24 17:03:06 瀏覽:489
hello密碼怎麼破解 發布:2025-01-24 17:03:06 瀏覽:73
pspfifa無緩存 發布:2025-01-24 16:45:13 瀏覽:165
androidhandler機制 發布:2025-01-24 16:41:10 瀏覽:936
安卓系統如何下載aov 發布:2025-01-24 16:29:53 瀏覽:573
iptables允許ip訪問 發布:2025-01-24 16:19:58 瀏覽:932
安卓80如何識別存儲卡許可權 發布:2025-01-24 16:19:54 瀏覽:232
存儲介質價格 發布:2025-01-24 16:19:18 瀏覽:151