Python魔術方法

2021-08-17 04:12:28 字數 4730 閱讀 6130

參考文章:

python 魔術方法指南

魔術方法,顧名思義是一種可以給物件(類)增加魔法的特殊方法,它們的表示方法一般是用雙下劃線包圍(如__init__)

from os.path import join

class

fileobject:

'''給檔案物件進行包裝從而確認在刪除時檔案流關閉'''

def__init__

(self, filepath='~', filename='sample.txt'):

#讀寫模式開啟乙個檔案

self.file = open(join(filepath, filename), 'r+')

def__del__

(self):

self.file.close()

del self.file

class

word

(str):

'''儲存單詞的類,定義比較單詞的幾種方法'''

def__new__

(cls, word):

# 注意我們必須要用到__new__方法,因為str是不可變型別

# 所以我們必須在建立的時候將它初始化

if' '

in word:

print("value contains spaces. truncating to first space.")

word = word[:word.index(' ')] #單詞是第乙個空格之前的所有字元

return str.__new__(cls, word)

def__gt__

(self, other):

return len(self) > len(other)

def__lt__

(self, other):

return len(self) < len(other)

def__ge__

(self, other):

return len(self) >= len(other)

def__le__

(self, other):

return len(self) <= len(other)

def

__setattr__

(self, name, value):

self.name = value

#每當屬性被賦值的時候, ``__setattr__()`` 會被呼叫,這樣就造成了遞迴呼叫。

#這意味這會呼叫 ``self.__setattr__('name', value)`` ,每次方法會呼叫自己。這樣會造成程式崩潰。

def__setattr__

(self, name, value):

self.__dict__[name] = value #給類中的屬性名分配值

#定製特有屬性

class

accesscounter:

'''乙個包含計數器的控制許可權的類每當值被改變時計數器會加一'''

def__init__

(self, val):

super(accesscounter, self).__setattr__('counter', 0)

super(accesscounter, self).__setattr__('value', val)

def__setattr__

(self, name, value):

if name == 'value':

super(accesscounter, self).__setattr__('counter', self.counter + 1)

#如果你不想讓其他屬性被訪問的話,那麼可以丟擲 attributeerror(name) 異常

super(accesscounter, self).__setattr__(name, value)

def__delattr__

(self, name):

if name == 'value':

super(accesscounter, self).__setattr__('counter', self.counter + 1)

super(accesscounter, self).__delattr__(name)]

class

functionallist:

'''乙個封裝了一些附加魔術方法比如 head, tail, init, last, drop, 和take的列表類。

'''def

__init__

(self, values=none):

if values is

none:

self.values =

else:

self.values = values

def__len__

(self):

return len(self.values)

def__getitem__

(self, key):

#如果鍵的型別或者值無效,列表值將會丟擲錯誤

return self.values[key]

def__setitem__

(self, key, value):

self.values[key] = value

def__delitem__

(self, key):

del self.values[key]

def__iter__

(self):

return iter(self.values)

def__reversed__

(self):

return reversed(self.values)

def(self, value):

defhead

(self):

return self.values[0]

deftail

(self):

return self.values[1:]

definit

(self):

#返回一直到末尾的所有元素

return self.values[:-1]

deflast

(self):

#返回末尾元素

return self.values[-1]

defdrop

(self, n):

#返回除前n個外的所有元素

return self.values[n:]

deftake

(self, n):

#返回前n個元素

return self.values[:n]

class

entity:

'''呼叫實體來改變實體的位置。'''

def__init__

(self, size, x, y):

self.x, self.y = x, y

self.size = size

def__call__

(self, x, y):

'''改變實體的位置'''

self.x, self.y = x, y

使用with語句來呼叫

class

closer:

'''通過with語句和乙個close方法來關閉乙個物件的會話管理器'''

def__init__

(self, obj):

self.obj = obj

def__enter__

(self):

return self.obj # bound to target

def__exit__

(self, exception_type, exception_val, trace):

try:

self.obj.close()

except attributeerror: # obj isn't closable

print('not closable.')

return

true

# exception handled successfully

限制class的屬性,但不限制class的子類的屬性,除非子類也使用__slots__

例子:使用__slots__會比不使用,減少40%~50%的記憶體

# 不使用__slots__

class

myclass

(object):

def__init__

(self, name, identifier):

self.name = name

self.identifier = identifier

self.set_up()

# 使用__slots__

class

myclass

(object):

__slots__ = ['name', 'identifier']

def__init__

(self, name, identifier):

self.name = name

self.identifier = identifier

self.set_up()

python 魔術方法

魔術方法 呼叫方式 解釋 new cls instance myclass arg1,arg2 new 在建立例項的時候被呼叫 init self instance myclass arg1,arg2 init 在建立例項的時候被呼叫 cmp self,other self other,self o...

Python 魔術方法

usr bin env python coding utf 8 author ray time 2018 12 6 魔術方法例項 init 建構函式,在生成物件時呼叫,用來初始化值 del 析構函式,釋放物件時使用 比如編輯檔案,把關閉檔案的操作寫在此方法中,程式結束時就會關閉軟體 str 使用pr...

Python 魔術方法

與運算子無關 類別方法名 數值轉換 abs bool complex int float hash index 模擬集合 len getitem setitem delitem contains 迭代列舉 iter reversed next 可呼叫模型 call 上下文管理 enter exit ...