方法意義
__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語...