16. super用法
super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序(mro)、重複呼叫(鑽石繼承)等種種問題。總之前人留下的經驗就是:保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。
17. 單例模式
1.
使用__new__
方法
如果想使得某個類從始至終最多只有乙個例項,使用__new__方法會很簡單。python中類是通過__new__來建立例項的:
class singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(singleton,cls).__new__(cls, *args, **kwargs)
return cls._instance
if __name__ == '__main__':
class a(singleton):
def __init__(self, s):
self.s = s
b = a('banana')
print id(a), a.s
print id(b), b.s
結果:29922256 banana
29922256 banana
通過__new__方法,將類的例項在建立的時候繫結到類屬性_inst上。如果cls._inst為none,說明類還未例項化,例項化並將例項繫結到cls._inst,以後每次例項化的時候都返回第一次例項化建立的例項。注意從singleton派生子類的時候,不要過載__new__。
2.共享屬性
有時候我們並不關心生成的例項是否具有同一id,而只關心其狀態和行為方式。我們可以允許許多個例項被建立,但所有的例項都共享狀態和行為方式:
class brog(object):
_shared_state = {}
def __new__(cls, *args, **kwargs):
obj = super(brog, cls).__new__(cls, *args, **kwargs)
obj.__dict__ = cls._shared_state
return obj
if __name__ == '__main__':
class example(brog):
pass
a = example()
b = example()
c = example()
adict = {}
j = 0
for i in a,b,c:
adict[i] = j
j += 1
for i in a,b,c:
print adict[i]
結果:2
將所有例項的__dict__指向同乙個字典,這樣例項就共享相同的方法和屬性。對任何例項的名字屬性的設定,無論是在__init__中修改還是直接修改,所有的例項都會受到影響。不過例項的id是不同的。要保證類例項能共享屬性,但不和子類共享,注意使用cls._shared_state,而不是borg._shared_state。因為例項是不同的id,所以每個例項都可以做字典的key.
3. import方法
python模組是天然的單例模式
# mysingleton.py
class my_singleton(object):
def foo(self):
pass
my_singleton = my_singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
18. 協程
簡單點說協程是程序和執行緒的公升級版,程序和執行緒都面臨著核心態和使用者態的切換問題而耗費許多切換時間,而協程就是使用者自己控制切換的時機,不再需要陷入系統的核心態.
python裡最常見的yield就是協程的思想!
19. 引用和copy(),deepcopy()的區別
import copy
a = [1,2,3,4,['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
print 'a = ', a
print 'b = ', b
print 'c = ', c
print 'd = ', d
結果:a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]
20. read,readline和readlines
python十大特性 python三大特性
python中也有三大特性,封裝 繼承和多型。封裝封裝,就是只能在類的內部訪問,外部訪問屬性或方法會報異常,python中的封裝很簡單,只要在屬性前或者方法名前加上兩個下劃線就可以,如self.name,def eat self 這樣就完成了屬性和方法的私有化,也就是封裝。在python中封裝並不是...
python動態語言特性小結
python 動態語言特性 a.動態模組呼叫 如果模組是動態的,如從某個配置檔案中讀取.那麼關於模組的字串如何轉換為 的import呢,下面 很好解釋了這一點 例子11 sys import sys 2 os import os 3 re import re 4 print sys.path 例子2...
Python語言特性 閉包
1.閉包的概述 閉包是指在乙個函式中定義了乙個另外乙個函式,內函式裡運用了外函式的臨時變數,並且外函式的返回值是內函式的引用,這樣就構成了乙個閉包。2.閉包的特點 總結一下,建立乙個閉包必須滿足以下幾點 由於這樣的特點,使用閉包,可以隱藏內部函式的工作細節,只給外部使用者提供乙個可以執行的內部函式的...