目錄
- 面向物件之魔法方法
- 一、魔法方法的概念
- 二、常用魔法方法
- 1、__ init __
- 2、__ str __
- 3、__ call __
- 4、__ getattr __
- 5、__ getattribute __
- 6、__ setattr __
- 7、__ enter __
- 8、__ exit __
- 三、魔法方法筆試題
- 第一題
- 第二題
面向物件之魔法方法
一、魔法方法的概念
? 定義在類中的雙下方法都可以稱為魔法方法
? 不需要人為呼叫,在特定的條件下會自動觸發,并運行
? 類似于__ 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))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/530005.html
標籤:面向對象