Python 方法呼叫流程詳解

2021-10-23 15:14:33 字數 2435 閱讀 8846

python 新式類引進了內建屬性__getattribute__,訪問屬性都要先通過內建屬性__getattribute__,接下來談談類和例項分別訪問屬性的過程

class devnull:

def __init__(self,initval = none,name='var'):

self.val = initval

self.name = name

def __get__(self, instance, owner):

#self指的是revealaccess例項,instance代表被**的類的例項,owner代表被**的類

print("獲取..",self.name)

return self.val

def __set__(self, instance, value):

print("設定值:",self.name)

self.val = value

class myclass(object):

x = devnull(1000,"var 'x'")

def foo(self):

print("hello world")

m=myclass()

m.x輸出:

獲取.. var 'x'

1000

x屬性是資料描述符,devnull同時擁有set和 __get__方法,例項訪問x,getattribute__會呼叫資料描述符的__get方法

m.x=1

m.x輸出:

設定值: var 'x'

獲取.. var 'x'

1

上面m.x=1觸發了資料描述符的__set__ 方法,修改了devnull中self.val的值。所以__get__返回的值也發生了變化。

print(m.__dict__)

輸出 {}

print(myclass.x)

myclass.x=1

print(myclass.x)

輸出:獲取.. var 'x'

1000

1

上面通過類訪問x,第一次通過資料描述符devnull 的__get__,而第二次訪問x,沒有經過__get__並且類對x的賦值並沒有觸發資料描述符的__set__方法;這說明類對x賦值,把之前類中資料描述符屬性x給覆蓋了,所以再次通過類訪問x,沒有經過__get__.

接下來分析非資料描述符的情況

class devnull:

def __init__(self,initval = none,name='var'):

self.val = initval

self.name = name

def __get__(self, instance, owner):

#self指的是revealaccess例項,instance代表被**的類的例項,owner代表被**的類

print("獲取..",self.name)

return self.val

# def __set__(self, instance, value):

# print("設定值:",self.name)

# self.val = value

class myclass(object):

x = devnull(1000,"var 'x'")

def foo(self):

print("hello world")

m=myclass()

m.x輸出:

獲取.. var 'x'

1000

可以看出和資料描述符的情況一直

m.x=1

print(m.x)

輸出:1

對於非資料描述符x,例項修改x的值後,訪問x, 沒有經過__get__,非資料描述符x被例項屬性x覆蓋了。

print(m.__dict__)

輸出:

接下來看下類訪問非資料描述符x

print(myclass.x)

myclass.x=1

print(myclass.x)

輸出:獲取.. var 'x'

1000

1

與最上面非資料描述符的情況一致;

通過以上的分析由此得出以下結論:

通過類訪問屬性時有無資料描述符區別

通過例項訪問屬性時,遵循

資料描述符級別》例項屬性》非資料描述符

對python 呼叫類屬性的方法詳解

測試時候類的呼叫是經常會用到的。簡單看下類的呼叫使用的方法吧。來看例子 目錄結構 我們現在要在do class.py這個檔案裡呼叫class learn.py裡的類 do class.py usr bin env python3 coding utf 8 author jock from all p...

python 呼叫 C C 詳解

接下來將簡單介紹python如何呼叫c和c 包括呼叫整型,陣列等情況。c函式返回整型int c test.c include include int func int a,int b 編譯成so包 gcc o testpycll 64.so shared fpic test.cpython impo...

python呼叫dll詳解

參考鏈結 windows安裝mingw w64教程 公司業務需要,讓我用python呼叫領導寫好的dll庫,經過一段時間的研究,終於呼叫成功,特此來記錄一下過程 開發環境win10 python3.6.8 64位 安裝這個的目的是生成dll檔案用,參考位址在上面,講一下注意的點。安裝的時候versi...