Python魔法方法之描述符

2021-09-30 21:02:02 字數 2273 閱讀 8337

先來看乙個demo吧:

class a():

def __init__(self):

self.a = 10

def geta(self):

return self.a

def seta(self, a):

self.a = a

def dela(self):

del self.a

'''將x與a聯絡起來 三個引數分別對應獲得函式 賦值函式 刪除函式'''

x = property(geta,seta,dela)

if __name__ == '__main__':

q = a()

print(q.x)#等價於print(q.a)

q.x = 11#等價於呼叫set函式賦值 q.seta(11)

print(q.a)

在上面的模組中,我們完全可以通過操作x來替代對a的操作,這就是描述符的作用。

下面我們來看這個麵塑負的實現原理:可以看到我們自定義的描述符新增了幾個魔法方法,這就是描述符的原理所在了:

這我們所寫的魔法方法中 instance我們就可以理解為是呼叫我們自定義描述符的c類的乙個例項 self就是描述符本身的例項

這樣去想應該就很容易理解它的原理 這幾個魔法方法都是會在例項被賦值或被訪問、刪除是自動呼叫的 要不然也稱不上是魔法方法,只一點要清楚

class myproperty():

'''在這裡instance就是c類建立的乙個例項 self就是x'''

def __init__(self, fget=none, fset=none, fdel=none):

self.fget = fget

self.fset = fset

self.fdel = fdel

def __get__(self, instance, owner):

return self.fget(instance)

def __set__(self, instance, value):

self.fset(instance, value)

def __delete__(self, instance):

self.fdel(instance)

class c():

def __init__(self):

self._x = none

def getx(self):

return self._x

def setx(self,value):

self._x = value

def delx(self):

del self._x

x = myproperty(getx, setx, delx)

最後,我們再來實現乙個溫度轉換的功能,當然是利用描述符來實現:

稍微的來說明一下吧:一開始我們進行了賦值即 t.fan = 100 那麼就會進入到fahrenheit的__set__方法裡 然後就又會轉到

class celsius():

def __init__(self, value = 26.0):

self.value = value

def __get__(self, instance, owner):

return self.value

def __set__(self, instance, value):

self.value = float(value)

class fahrenheit():

def __get__(self, instance, owner):

return instance.cel * 1.8 + 32

def __set__(self, instance, value):

instance.cel = (float(value) - 32) / 1.8

class temperature():

'''相當於兩個property'''

cel = celsius()

fah = fahrenheit()

if __name__ == '__main__':

t = temperature()

t.fah = 100#賦值操作

print(t.cel)

t.cel = 38#賦值操作

print(t.fah)

輸出:

37.77777777777778

100.4

Python魔法方法 基本的魔法方法

new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...

Python 基礎之魔法方法

構造方法類似於初始化方法,但是構造方法與其他普通的方法的不同之處在於,當乙個物件被建立之後,會立即呼叫構造方法。class servant object definit self self.servant saber fb servant fb.init print fb.servant class...

python 魔法方法

魔法方法具有一定的特徵 new cls class capstr str def new cls,string 修改新類裡的new方法,需傳入乙個引數 string string.upper return str.new cls,string 用父類裡的new方法進行返回,直接飯後構造後的物件def...