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...