參考文章:
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 ...