類與物件深度問題與解決技巧 3 上下文管理器

2021-10-02 14:42:14 字數 1425 閱讀 7202

首先寫乙個簡單的異常處理

try:

f = open('demo.txt', 'w')

# 丟擲異常

raise typeerror

# 捕獲異常

except typeerror as e:

print('typeerror')

f.close()

except valueerror as e:

print('valueerror')

f.close()

except exception as e:

print('exception')

f.close()

finally:

print('end...')

# typeerror

# end...

使用上下文管理器的目的就是簡化以上的操作

with open(『demo.txt』, 『w』) as f:

f.write()

那類可以支援上下文管理器嗎?

class sample(object):

def __enter__(self):

print('start')

return self

def demo(self):

print('sample...')

def __exit__(self, exc_type, exc_val, exc_tb):

print(exc_type) # 異常類 print(exc_val) # 異常值 'sample' object has no attribute 'demos'

print(exc_tb) # 追蹤資訊,也就是在哪一行報錯 print('ending')

with sample() as sample:

sample.demos()

想要類支援上下文管理器必須要有__enter__和__exit__方法

還有一種更簡單的上下文管理器,通過修飾器

import contextlib

@contextlib.contextmanager

def text(name):

print('start...')

yield {}

print('ending...')

# yield 上面的相當於__enter__函式,下面相當於__exit__函式

with text('juren') as f:

print('operation')

# start...

# operation

# ending...

類與物件深度問題與解決技巧(1)

比如我們想定義乙個inttuple類,表示接受引數後,只取其中int型別,且大於0的,然後存為tuple型別 首先我們想到繼承父類tuple,然後修改一下 class inttuple tuple def init self,iterable for i in iterable ifisinstan...

類與物件深度問題

defnew cls 建立乙個類物件,自動執行,當期執行時如果沒有創造物件並且返回則不會執行 init 方法,因為 init 方法是只有物件被建立時才會自動呼叫。一般init會自動呼叫是因為物件被自動建立了,所有類的父類object有這個功能,噹噹你執行了 new 之後object不會在執行,所以假...

類與物件(上)

this指標 c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式。結構體的定義,在c 中更喜歡用class來代替。class classname 一定要注意後面的分號 類的兩種定義方式 1 宣告和定義全部放在類體中,需要注意 成員函式如果在類中定義,編譯器可能會將其當...