11、有用過with statement(語句)嗎?它的好處是什么?
# 答案
'''
with語句會在嵌套的代碼執行之后,自動關閉文件。這種做法的還有另一個優勢就是,無論嵌套的代碼是以何種方式結束的,它都關閉文件。如果在嵌套的代碼中發生異常,它能夠在外部exception handler catch異常前關閉文件。如果嵌套代碼有return/continue/break語句,它同樣能夠關閉文件。
'''
12、下列數據結構中,哪一種是不可迭代的
'''
A. dict
B. object
C. set
D. str
'''
# 答案:
B
13、實現一個Singleton單例類,要求遵循基本語言編程規范(用盡量多的方 式)。
# 答案:
1.__new__
class Borg(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
ob = super(Borg, cls)
cls._instance = ob.__new__(cls, *args, **kwargs)
return cls._instance
class MyClass(Borg):
def __init__(self):
self.a = 1
2.共享屬性
class Borg2(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Borg2, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob
class MyClass(Borg2):
def __init__(self):
self.a = 1
3.裝飾器
def singleton(cls, *args, **kwargs):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return getinstance
@singleton
class MyClass(object):
def __init__(self):
self.a = 1
4.import方法
# mysingleton .py
class MyClass(object):
def __init__(self):
self.a = 1
s_myclass = MyClass()
from mysingleton import s_myclass
s_myclass.a
14、請述with的用法,如果自己的類需要支持with語句,應該如何書寫?
基本格式
with context_expression [as target(s)]:
with-body
這里 context_expression 要返回一個上下文管理器對象,該對象並不賦值給 as 子句中的 target(s) ,如果指定了 as 子句的話,會將上下文管理器的 __enter__() 方法的返回值賦值給 target(s)。
target(s) 可以是單個變量,或者由“()”括起來的元組(不能是僅僅由“,”分隔的變量列表,必須加“()”)。
自定義的上下文管理器要實現上下文管理協議所需要的 __enter__() 和 __exit__() 兩個方法
context_manager.__enter__() :進入上下文管理器的運行時上下文,在語句體執行前調用。with 語句將該方法的返回值賦值給 as 子句中的 target,如果指定了 as 子句的話
context_manager.__exit__(exc_type, exc_value, exc_traceback) :退出與上下文管理器相關的運行時上下文,返回一個布爾值表示是否對發生的異常進行處理。
15、python 中如何判斷一個對象是否可調用? 哪些對象可以是可調用對象?如何定義一個類,使其對象本身就是可調用對象?
# 答案:
# python 中如何判斷一個對象是否可調用
def func():
pass
print(callable(func)) # True
# 哪些對象可以是可調用對象
1.類對象
2.所有帶有_call_()方法的對象
# 如何定義一個類,使其對象本身就是可調用對象
一個類實例也可以變成一個可調用對象,只需要實現一個特殊方法call()。