建立類的時候径玖,需要使用_init_魔法方法瘪贱,感到好奇扬卷,查閱資料后牙言,總結一下。
_new_(cls[,...])
當對象創(chuàng)建時邀泉,第一個調用的方法就是_new_,而前面說到的_init_方法更像是一個配置文件嬉挡。_new_才是真正的構造函數,創(chuàng)建并返回一個實例對象汇恤,如果_new_只調用了一次庞钢,就會得到一個對象。它的第一個參數是這個類因谎,其他的參數是用來直接傳遞給_init_ 方法基括。
- _new_ 是在一個對象實例化的時候所調用的第一個方法
- 它的第一個參數是這個類,其他的參數是用來直接傳遞給 _init_ 方法
- _new_ 決定是否要使用該 _init_ 方法财岔,因為 _new_ 可以調用其他類的構造方法或者直接返回別的實例對象來作為本類的實例风皿,如果 _new_ 沒有返回實例對象,則 _init_ 不會被調用
- _new_ 主要是用于繼承一個不可變的類型比如一個 tuple 或者 string
class TestClass:
def __init__(self):
print("調用__init__")
def __new__(cls, *args, **kwargs):
print("調用__new__")
return object.__new__(cls)#返回當前類的實例
t = TestClass()
上下文管理器
可能有人好奇上下文管理器是什么匠璧,和魔法方法有啥關系桐款?平時讀取文件的時候,常常說要使用with open()來進行文件內容的讀取夷恍,而with后跟著的就是上下文管理器魔眨,簡單的說,任何實現了_enter_方法和_exit_方法的對象都可以稱之為上下文管理器酿雪。它可以在執(zhí)行with 包裹的執(zhí)行代碼(也就是自己寫的那部分)前后執(zhí)行對應的_enter_方法或_exit_方法遏暴,可以想到的就是open()執(zhí)行的_enter_是打開文件,而_exit_則是關閉了文件指黎。順便說一句朋凉,python還提供了一個contextmanager的裝飾器,更進一步簡化了上下文管理器的實現方式醋安。
class TestClass:
def __init__(self,name):
self.name = name
def __enter__(self):
print("%s開始工作啦杂彭!"%self.name)
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None: # 可以利用exc_type來捕獲異常
print("%s結束工作啦墓毒!"%self.name)
else:
print("工作出錯了!")
print('Type: ', exc_type)
print('Value:', exc_val)
print('TreacBack:', exc_tb)
# 返回值決定了捕獲的異常是否繼續(xù)向外拋出
# 如果是 False 那么就會繼續(xù)向外拋出盖灸,程序會看到系統(tǒng)提示的異常信息
# 如果是 True 不會向外拋出蚁鳖,程序看不到系統(tǒng)提示信息,只能看到else中的輸出
return True
t = TestClass(name = "卡比獸")
with t :
raise NameError
print:
卡比獸開始工作啦赁炎!
工作出錯了醉箕!
('Type: ', <type 'exceptions.NameError'>)
('Value:', NameError())
('TreacBack:', <traceback object at 0x0000000003CF9348>)
待更新。徙垫。讥裤。
參考鏈接