38、面向對象深度優先和廣度優先是什么?




39、面向對象中super的作用?

40、是否使用過functools中的函數?其作用是什么?
1 Python自帶的 functools 模塊提供了一些常用的高階函數,也就是用於處理其它函數的特殊函數。換言之,就是能使用該模塊對可調用對象進行處理。 2 3 functools模塊函數概覽 4 functools.cmp_to_key(func) 5 functools.total_ordering(cls) 6 functools.reduce(function, iterable[, initializer]) 7 functools.partial(func[, args][, *keywords]) 8 functools.update_wrapper(wrapper, wrapped[, assigned][, updated]) 9 functools.wraps(wrapped[, assigned][, updated])
41、列舉面向對象中帶雙下划線的魔術方法?
1. init()
2. del()
1 在調用del方法的時候,實際使用的是del() 2 3 class Person(object): 4 def __del__(self): 5 print('我給干掉啦') 6 7 bill = Person() 8 del bill #我給干掉啦
3. new()
1 new()只有繼承自objectd的類才有new()這方法是在init()之前調用的,用於生成實例對象。多用於設計模式中的單例模式。單例模式是為了確保類有且只有一個對象。多用於日志記錄和數據庫操作,打印機后台處理程序。這樣子可以避免對統一資源產生相互沖突的請求 2 new()負責創建一個類的對象,init()方法負責對創建后的類對象進行默認設置 3 class Singleton(object): 4 def __new__(cls): 5 if not hasattr(cls, 'instance'): 6 cls.instance = super(Singleton, cls).__new__(cls) 7 return cls.instance 8 9 s = Singleton() 10 print('Object created', s) 11 s1 = Singleton() 12 print('Object created', s1) 13 14 # output 15 # Object created <__main__.Singleton object at 0x0000018EFF662DA0> 16 # Object created <__main__.Singleton object at 0x0000018EFF662DA0> 17 18 cls是當前類,new()返回的是一個實例,和init()中的self是同一個東西
42、如何判斷是函數還是方法?
一般情況下,單獨寫一個def func():表示一個函數,如果寫在類里面是一個方法。但是不完全准確。
1 class Foo(object): 2 def fetch(self): 3 pass 4 5 print(Foo.fetch) # 打印結果<function Foo.fetch at 0x000001FF37B7CF28>表示函數 6 # 如果沒經實例化,直接調用Foo.fetch()括號里要self參數,並且self要提前定義 7 obj = Foo() 8 print(obj.fetch) # 打印結果<bound method Foo.fetch of <__main__.Foo object at 0x000001FF37A0D208>>表示方法
43、面向對象中的property屬性、類方法、靜態方法?
property屬性:

類方法:

靜態方法:

44、列舉面向對象中的特殊成員以及應用場景
1 1. __doc__ 2 表示類的描述信息 3 class Foo: 4 """ 描述類信息,這是用於看片的神奇 """ 5 def func(self): 6 pass 7 print Foo.__doc__ 8 9 ============== 10 描述類信息,這是用於看片的神奇
1 2. __module__ 和 __class__ 2 __module__ 表示當前操作的對象在哪個模塊 3 __class__ 表示當前操作的對象的類是什么
1 3. __init__ 2 構造方法,通過類創建對象時,自動觸發執行。
1 4. __del__ 2 析構方法,當對象在內存中被釋放時,自動觸發執行。 3 4 注:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。
5. __call__ 對象后面加括號,觸發執行。 注:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對於 __call__ 方法的執行是由對象后加括號觸發的,即:對象() 或者 類()()
6. __dict__ 類或對象中的所有成員
7. __str__ 如果一個類中定義了__str__方法,那么在打印 對象 時,默認輸出該方法的返回值。
8、__eq__
45、什么是反射?以及應用場景?





46、用盡量多的方法實現單例模式。
一、模塊單例
Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。
1 #foo1.py 2 class Singleton(object): 3 def foo(self): 4 pass 5 singleton = Singleton() 6 7 #foo.py 8 from foo1 import singleton
二、靜態變量方法
先執行了類的__new__方法(我們沒寫時,默認調用object.__new__),實例化對象;然后再執行類的__init__方法,對這個對象進行初始化,所有我們可以基於這個,實現單例模式。
1 class Singleton(object): 2 def __new__(cls,a): 3 if not hasattr(cls, '_instance'): 4 cls._instance = object.__new__(cls) 5 return cls._instance 6 def __init__(self,a): 7 self.a = a 8 def aa(self): 9 print(self.a) 10 11 a = Singleton("a")
47、裝飾器的寫法以及應用場景。


48、異常處理寫法以及如何主動跑出異常(應用場景)


49、isinstance作用以及應用場景?

50、json序列化時,可以處理的數據類型有哪些?如何定制支持datetime類型?
1 官方文檔中的一個Demo: 2 >>> import json 3 4 >>> class ComplexEncoder(json.JSONEncoder): 5 ... def default(self, obj): 6 ... if isinstance(obj, complex): 7 ... return [obj.real, obj.imag] 8 ... return json.JSONEncoder.default(self, obj) 9 ... 10 >>> dumps(2 + 1j, cls=ComplexEncoder) 11 '[2.0, 1.0]' 12 >>> ComplexEncoder().encode(2 + 1j) 13 '[2.0, 1.0]' 14 >>> list(ComplexEncoder().iterencode(2 + 1j)) 15 ['[', '2.0', ', ', '1.0', ']'] 16
1 然后簡單擴展了一個JSONEncoder出來用來格式化時間 2 class CJsonEncoder(json.JSONEncoder): 3 4 def default(self, obj): 5 if isinstance(obj, datetime): 6 return obj.strftime('%Y-%m-%d %H:%M:%S') 7 elif isinstance(obj, date): 8 return obj.strftime('%Y-%m-%d') 9 else: 10 return json.JSONEncoder.default(self, obj) 11
1 使用時候只要在json.dumps增加一個cls參數即可: 2 3 json.dumps(datalist, cls=CJsonEncoder)
51、json序列化時,默認遇到中文會轉換成unicode,如果想要保留中文怎么辦?

52、使用代碼實現查看列舉目錄下的所有文件。
1 import os 2 3 if __name__ == '__main__': 4 work_dir = 'C:\Program Files\MySQL\Connector ODBC 8.0' 5 for parent, dirnames, filenames in os.walk(work_dir, followlinks=True): 6 for filename in filenames: 7 file_path = os.path.join(parent, filename) 8 print('文件名:%s' % filename) 9 print('文件完整路徑:%s\n' % file_path)
53、簡述 yield和yield from關鍵字。
1、可迭代對象與迭代器的區別
可迭代對象:指的是具備可迭代的能力,即enumerable. 在Python中指的是可以通過for-in 語句去逐個訪問元素的一些對象,比如元組tuple,列表list,字符串string,文件對象file 等。
迭代器:指的是通過另一種方式去一個一個訪問可迭代對象中的元素,即enumerator。在python中指的是給內置函數iter()傳遞一個可迭代對象作為參數,返回的那個對象就是迭代器,然后通過迭代器的next()方法逐個去訪問。
1 from collections import Iterable 2 3 li=[1,4,2,3] 4 iterator1 = iter(li) 5 print(next(iterator1)) 6 print(next(iterator1)) 7 print(next(iterator1)) 8 print(isinstance(iterator1,Iterable)) # 判斷是否是迭代器,導入collection模塊
>>>
1 4 2 True
2、生成器
生成器的本質就是一個逐個返回元素的函數,即“本質——函數”
最大的好處在於它是“延遲加載”,即對於處理長序列問題,更加的節省存儲空間。即生成器每次在內存中只存儲一個值
3、什么又是yield from呢?
簡單地說,yield from generator 。實際上就是返回另外一個生成器。如下所示:
1 def generator1(): 2 item = range(10) 3 for i in item: 4 yield i 5 6 def generator2(): 7 yield 'a' 8 yield 'b' 9 yield 'c' 10 yield from generator1() #yield from iterable本質上等於 for item in iterable: yield item的縮寫版 11 yield from [11,22,33,44] 12 yield from (12,23,34) 13 yield from range(3) 14 15 for i in generator2() : 16 print(i)
從上面的代碼可以看出,yield from 后面可以跟的式子有“ 生成器 元組 列表等可迭代對象以及range()函數產生的序列”
上面代碼運行的結果為:
a
b
c
0
1
2
3
4
5
6
7
8
9
11
22
33
44
12
23
34
0
1
2
請關注,未完待續!

