在python中有很多魔法方法,常見的__init__(self)就是魔法方法的一種,類繫結物件是自動觸發。那就來聊一聊其他的魔法方法。
__str__方法
這中方法需要返回值,並且返回值為字串型別。
#str 方法
class
a:
def__str__(self): #
列印物件self觸發。登出是結果1,未登出時結果2
return''
pass
a =a()
print(a) #
結果1:<__main__.a object at 0x0000026af987d208> 結果2:
__del__方法
這種方法在刪除物件時,程式結束時(類的物件消失)會自動觸發
#del 方法
class
a:
def__del__(self): #
self刪除時觸發
print('
aaaa')
pass
a =a()
print(a)
__call__方法
在類中定義此函式。物件呼叫此函式只需要物件名加(),即可呼叫此函式。
classa:
def__call__(self, *args, **kwargs):
print('
aaa'
)a =a()
a()
#執行__call__函式 結果:aaa
__slots__方法
這方法形式不是乙個函式形式(沒有def),它可給類劃分適合大小的記憶體儲存屬性,但是也限制了類的擴充套件其他屬性。
#slots方法
import
sysclass
a:
__slots__ = ['
name
'] #
限制類的屬性,在這設定,
def__init__
(self, name):
self.name =name
a = a('
meking
') #
不能新增其他屬性,否則報錯
print(sys.getsizeof(a)) #
檢視類的記憶體大小 》48
點語法的實現
在實現點語法需要getattr,setatter, delattr這幾個函式。getattr,在查詢某個屬性名,無此屬性會觸發。setattr,在給某個屬性名賦值是會觸發。delattr,在刪除屬性名會被觸發。getattribute不可與setatter一起使用。它的用法是,已經有點屬性值,呼叫時,它會被觸發。
classa: age = 1 #
測試getattribute函式
def__getattr__
(self, key):
return
'getattr
', key
def__setattr__
(self, key, value):
self.
__dict__[key] = value #
類內的屬性值與名是以字典鍵值對的形式繫結
print('
setattr
', key, value, self.__dict__
[key])
def__delattr__
(self, key):
del self.__dict__
[key]
print('
delattr
', key)
def__getattribute__(self, key): #
屬性存在,使用.屬性名稱優先執行此函式
return key, '
getattribute
'a =a()
print(a.age) #
不存在的乙個屬性,執行getattr函式,並且此函式有返回值,不寫為none
a.name = '值'
#.語法繫結值時 執行setattr函式。 無返回值
del a.name #
刪除屬性時。執行delattr函式
[ ]語法的實現
這種語法需要關鍵字getitem, setitem, setitem, delitem。呼叫屬性名對應的值,可以用呼叫字典的方式。
classa:
def__getitem__
(self, item):
print('
getitem')
return
'getitem
', item
def__setitem__
(self, key, value):
self.
__dict__[key] =value
print('
setitem')
return self.__dict__
[key], value
def__delitem__
(self, key):
print('
delitem')
del self.__dict__
[key]
a =a()
print(a['
age']) #
類中無此屬性名,先執行getitem函式
a['age
'] = 18 #
先執行setitem函式
del a['
age'] #
執行delitem函式
運算子在物件中的應用
類之間,物件之間也可以比大小。比值需要依據比值的規則。在gt, lt , eq即可實現。
classa:
def__init__
(self,name, age):
self.name =name
self.age =age
def__gt__(self, other): #
物件與物件之間比較,
if self.age > other.age: #
比較的標準,依據年齡
return
true
else
:
return
false
a = a('
meking
', 20)
b = a('
meking
', 18)
print(a > b)
類中定義迭代器
classa:
def__init__
(self, start, end, step):
self.start =start
self.end =end
self.step =step
def__iter__
(self, ):
return self #
返回本身
def__next__
(self):
a =self.start
self.start +=self.step
if a return
a
else
:
raise stopiteration #
終止迴圈。不然會死迴圈
print(a(1, 10, 1).__iter__()) #
__inter__方法
for i in a(1, 10, 1): #
迭代取值
print(i, end='
, ')
類中的上下文管理
classa:
def__init__(self, path): #
傳入檔案路徑
self.file = open(path) #
開啟檔案
def__enter__
(self):
res =self.file.read()
return res #
返回物件本身
def__exit__(self, exc_type, exc_val, exc_tb): #
exc_type,exc_cal,exc_tb已將捕獲
self.file.close()
return
true
with a(
'a.txt
') as f:
print(f)
多型是一種概念,在python中滿足能夠相應同一方法,產生不同結果的都可以稱之為多型。在計算字串,列表,字典的長度都可以使用len()這個方法,但是結果不同,這種就可以成為多型的一種現象。
isinstance(a, b):實質是判斷a這個物件是不是b這個型別的。物件和類之間的判斷
issubclass(a, a),判斷類與類之間是否有繼承關係。 類與類之間判斷
類的魔法方法
構造和析構 構造 類定義時,有時候寫 init 方法,有時候卻沒有,這是為什麼呢?init self,答 需求!new cls 重寫str字串類 calss upstr str def new cls,string string會原封不動的傳給init方法 string string.upper r...
python中類的魔法方法
xx 這種方法,在 中均稱為魔法方法 init self 該方法的作用是初始化物件 在建立物件時被預設呼叫,不需要手動調節 self引數不需要開發者傳遞,直譯器會自動將建立的物件傳遞過去 str self def str self return 這是海爾洗衣機的說明書 執行結果 這是海爾洗衣機的說明...
Python類的魔法方法
名字重整,類中例項物件的私有屬性,可以使用 dict 檢視,檢視到的私有屬性其實已經改名為 類名 屬性名,可以使用例項物件.類名 屬性名檢視。表示類的描述資訊 module 表示當前操作的物件在那個模組 class 表示當前操作的物件的類是什麼 test.py test.py coding utf ...