一件舵、Python中單下劃線和雙下劃線的區(qū)別
1秀姐、_xxx 不能用于’from module import *’ 以單下劃線開頭的表示的是protected類型的變量养泡。即保護類型只能允許其本身與子類進行訪問埂奈。
2迄损、__xxx 雙下劃線的表示的是私有類型的變量。只能是允許這個類本身進行訪問了账磺。連子類也不可以
3芹敌、__xxx___ 定義的是特列方法。像__init__之類的
二垮抗、類變量 和 實例變量
1氏捞、類變量可以使用className.類變量和self.類變量兩種方式訪問。
2冒版、如果使用self.類變量的方式訪問并重新賦值后液茎,這個變量就會成為實例變量和self綁定,實際上就變成了一個實例變量,實例變量會屏蔽掉類變量的值捆等。
3滞造、類變量是共享的,最好使用類名的方式來訪問類變量栋烤。
4谒养、類變量通過sel訪問時,就會被轉化成實力變量明郭,被綁定到特定的實例上买窟。
5、實例變量(self)的形式對類變量重新賦值后薯定,類變量的值不會隨之變化蔑祟。
6、實例變量對每一個對象是不可見的沉唠,每一個對象擁有著可能不同的值疆虚。
三、new和init的區(qū)別
__new__是一個靜態(tài)方法,而__init__是一個實例方法.
__new__方法會返回一個創(chuàng)建的實例,而__init__什么都不返回.
只有在__new__返回一個cls的實例時后面的__init__才能被調用.
當創(chuàng)建一個新實例時調用__new__,初始化一個實例時用__init__.
四满葛、單例模式
使用new方法
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
共享屬性
創(chuàng)建實例時把所有實例的dict指向同一個字典,這樣它們具有相同的屬性和方法.
class Borg(object):
_state = {}
def __new__(cls, *args, **kw):
ob = super(Borg, cls).__new__(cls, *args, **kw)
ob.__dict__ = cls._state
return ob
class MyClass2(Borg):
a = 1
裝飾器版本
def singleton(cls, *args, **kw):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass:
...
import方法
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
五径簿、copy, deepcopy()
賦值(=),就是創(chuàng)建了對象的一個新的引用嘀韧,修改其中任意一個變量都會影響到另一個篇亭。
淺拷貝:創(chuàng)建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象锄贷,另外一個也會修改改變){
1,完全切片方法译蒂;
2,工廠函數(shù),如list()谊却;
3,copy模塊的copy()函數(shù)
}
深拷貝:創(chuàng)建一個新的對象柔昼,并且遞歸的復制它所包含的對象(修改其中一個,另外一個不會改變){copy模塊的deep.deepcopy()函數(shù)}
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始對象
b = a #賦值炎辨,傳對象的引用
c = copy.copy(a) #對象拷貝捕透,淺拷貝
d = copy.deepcopy(a) #對象拷貝,深拷貝
a.append(5) #修改對象a
a[4].append('c') #修改對象a中的['a', 'b']數(shù)組對象
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']]
六碴萧、Python垃圾回收機制
Python GC主要使用引用計數(shù)(reference counting)來跟蹤和回收垃圾乙嘀。在引用計數(shù)的基礎上,通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環(huán)引用問題破喻,通過“分代回收”(generation collection)以空間換時間的方法提高垃圾回收效率虎谢。
七、關于 is 與 ==
is是對比地址,==是對比值
八曹质、如何在一個function里面設置一個全局的變量
#解決方法是在function的開始插入一個global聲明:
def f()
global x
九婴噩、單引號擎场,雙引號,三引號的區(qū)別
答:單引號和雙引號是等效的讳推,如果要換行顶籽,需要符號(\),三引號則可以直接換行玩般,并且可以包含注釋
如果要表示Let’s go 這個字符串
單引號:s4 = ‘Let\’s go’
雙引號:s5 = “Let’s go”
s6 = ‘I realy like“python”!’
"""
這里的東西不會被轉義
"""
這就是單引號和雙引號都可以表示字符串的原因了
十银觅、匿名函數(shù)
def multipliers():
return [lambda x : i * x for i in range(4)]
print [m(2) for m in multipliers()]
輸出 [6, 6, 6, 6]
十一、隊列
Queue.Queue()對多線程是安全的,對多進程是非進程安全的
multiprocessing.Queue()對多進程是安全的
十二坏为、logging
logging 是線程安全的, 但是非多進程安全
可使用ConcurrentLogHandler,自動創(chuàng)建一個.lock文件究驴,通過鎖的方式來安全的寫日志文件
十三、IO密集型任務匀伏、計算密集型任務
多線程適合IO密集型任務
多進程適合計算密集型任務
十四洒忧、高并發(fā)解決方案
https://www.google.com/search?q=python高并發(fā)解決方案
twisted->tornado->gevent,能扯到golang,erlang更好