python的魔術方法之上下文管理

2021-09-23 17:04:27 字數 3526 閱讀 2288

方法意義

__enter __

進入與此物件相關的上下文。如果存在該方法,with語法會把該方法的返回值作為繫結到as子句中指定的變數上

__exit __

退出與此物件相關的上下文。

import time

class

point

:def

__init__

(self)

:print

("1:init----------"

) time.sleep(1)

print

('init over'

)def

__enter__

(self)

:print

('2,enter ~~~~~~~~'

)return

1# as 後面的識別符號拿到的就是__enter__的返回值

def__exit__

(self,exc_type,exc_val,exc_tb)

:print

('exit'

)

f = point(

)# 例項化f的時候,並不進入__enter__

with point(

)as p:

print

('3 -----------')-

----

----

----

----

----

----

----

----

----

---1

:init---

----

---init over

1:init---

----

---init over

2,enter ~~~

~~~~

~3--

----

----

-exit

方法的引數

__exit__方法返回乙個等效true的值,則壓制異常;否則,繼續丟擲異常 如下

class

point

:def

__init__

(self, x, y)

: self.x = x

self.y = y

print(1

,self)

def__enter__

(self)

:print

('2 ------------'

)return

1def

__exit__

(sefl,exc_type, exc_val, exc_tb)

:print(3

,exc_type)

print(4

,exc_val)

print(5

,exc_tb)

return

1def

__str__

(self)

:return

str(

(self.x,self.y)

)with point(2,

3)as p:

a =1/

0# 此處除0異常,本應該拋異常,但是__exit__()方法中有return值,且等效為true,所以異常被壓制,因為異常,所以'pass'並不能列印

print(6

,'pass')-

----

----

----

----

----

----

----

----

----

----

-1(2

,3)2

----

----

----

3<

class

'zerodivisionerror'

>

4 division by zero

5>

下面的類即可以用在上下文管理,又可以用做裝飾器

import time

import datetime

class

timed

:"""this is decoration"""

def__init__

(self, fn)

: self.fn = fn

self.__doc__ = fn.__doc__ #例項屬性更改應該在初始化配置的時候更改

self.__name__ = fn.__name__

def__enter__

(self)

: self.start = datetime.datetime.now(

)return self

def__exit__

(self, exc_type, exc_val, exc_tb)

: delta =

(datetime.datetime.now(

)- self.start)

.total_seconds(

)print

("{} took {}s. context"

.format

(self.fn.__name__, delta)

)def

__call__

(self,

*args,

**kwargs)

:#例項功能的增加在函式呼叫的位置增加

start = datetime.datetime.now(

) ret = self.fn(

*args,

**kwargs)

delta =

(datetime.datetime.now(

)- start)

.total_seconds(

)print

(delta)

return ret

@timed # add = timed(add)

defadd

(x, y)

:'''this is add function'''

time.sleep(1)

v = x + y

print

(v)return x + y

add(3,

6)print

(add.__doc__,

";",add.__name__)--

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

--91.000373

this is add function ; add

Python魔術方法之上下文管理

魔術方法 上下文管理 檔案io操作可以對檔案物件使用上下文管理,使用with as語法 with open test as f pass 仿照上例寫乙個自己的類 提示錯誤 上下文管理物件 方法意義 enter進入與此物件相關的上下文,如果存在該方法,with語法會把該方法的返回值作為繫結到as子句中...

魔術方法之上下文管理

檔案io操作可以對檔案物件使用上下文管理,使用with as語法。with open test as f pass仿照上例寫乙個自己的類,實現上下文管理 classa pass with a as f attributeerror enter pass提示屬性錯誤,沒有 enter 看來需要這個類屬...

魔術方法 上下文管理

檔案io操作可以對檔案物件使用上下文管理,使用with as語法 上下文管理物件 方法意義 enter 進入與此物件相關的上下文.如果存在該方法,with語法會把該方法的返回值作為繫結到as子句中指定的變數上 exit 退出與此物件相關的上下文 例項化物件的時候,並不會呼叫enter,進入with語...