面向對象之魔法方法 一、魔法方法的概念 定義在類中的雙下方法都可以稱為魔法方法 不需要人為調用,在特定的條件下會自動觸發,並運行 類似於__ init__, 當我在使用類產生對象時,會自動觸發 class Foo: # 雙下init就是魔法方法的一種 def __init__(self, ...
目錄
面向對象之魔法方法
一、魔法方法的概念
定義在類中的雙下方法都可以稱為魔法方法
不需要人為調用,在特定的條件下會自動觸發,並運行
類似於__ init__, 當我在使用類產生對象時,會自動觸發
class Foo:
# 雙下init就是魔法方法的一種
def __init__(self, name, age):
self.name = name
self.age = age
二、常用魔法方法
1、__ init __
__init__(self):
self: 調用者本身
對象添加獨有數據時,會自動觸發
2、__ str __
__str__(self):
self: 調用者本身
對象被執行列印操作時會自動觸發,該方法下必須使用return設置返回值,且返回值必須為字元串,否則報錯
3、__ call __
__call__(self, *args, **kwargs):
self: 調用者本身
args:位置形參
kwargs:關鍵字新參
對象加括弧調用時會自動觸發
4、__ getattr __
__getattr__(self, item):
self: 調用者本身
item:調用者點的名字
對象點不存在的名字時會自動觸發該函數體代碼,該方法形參內item為對象點出的名字,當同一類中同時出現__getattribute__方法時,系統預設使用__getattribute__
5、__ getattribute __
__getattribute__(self, item):
self: 調用者本身
item:調用者點的名字
對象點名字時會自動觸發該函數體代碼,該方法形參內item為對象點出的名字,一旦該方法觸發,就無法獲取到對象點名字的值
6、__ setattr __
__setattr__(self, key, value):
self: 調用者本身
key:數據名字
valuse:名字對應的數據值
給對象添加/修改數據值的時候會自動觸發,該方法形參內名字,分別對應對象點的名字和值
7、__ enter __
__enter__(self):
self: 調用者本身
當對象被當作with上下文管理操作的時候開始自動觸發,該方法return返回什麼,as後的變數名就會收到什麼
8、__ exit __
__exit__(self, exc_type, exc_val, exc_tb):
self: 調用者本身
with上下文管理運行完畢之後會自動觸發(子代碼體結束)
三、魔法方法筆試題
第一題
條件:
補全下列代碼,使運行不會報錯
class Context:
pass
with Context() as f:
f.do_something()
'''
推導思維:
1、類加括弧產生對象
2、當對象被with傳入上下文管理使,就要用到__enter__方法
3、__enter__方法返回值為f,使用該方法返回對象本身(self)
4、對象加點的方式調用功能
5、將該功能補全至類體代碼中
6、子代碼結束後,調用__exit__關閉with
'''
class Context:
def do_something(self):
pass
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
with Context() as f:
f.do_something()
第二題
條件:
自定義字典類型並讓字典能夠通過句點符的方式操作鍵值對
'''
推導思維:
1、使用類繼承dict方法
2、使用__setattr__方法,將鍵值對以索引賦值的方式傳給self
3、使用__getattr__的方法,當對象點名字時,使用return的方式將值傳出
4、上述兩種方式分別可以實現以點的方式添加數值和取到數值
'''
class MyDict(dict):
def __setattr__(self, key, value):
self[key] = value
def __getattr__(self, item):
return self.get(item)
obj = MyDict()
obj.name = 'jason'
obj.pwd = 18
obj.hobby = 'read'
# print(obj)
print(obj.name)
print(obj.pwd)
print(obj.hobby)
# print(obj)
# print(obj) # 字典存儲的數據 {}
# print(obj.__dict__) # 字典對象名稱空間 {'name': 'jason'}
print(type(obj))