__all__
的用法
常晨张危看源碼發(fā)現(xiàn)__init__.py
文件中有__all__
,關(guān)于它的用法舉個(gè)栗子:
__all__ = ['bar', 'baz']
waz = 5
bar = 10
def baz():
return 'baz'
__all__
僅僅影響from foo import *
,會(huì)認(rèn)為沒(méi)在__all__
中的對(duì)象無(wú)法導(dǎo)入.
from foo import *
print bar
print baz
# waz將會(huì)報(bào)異常
print waz
但如果使用from foo import waz
,則能夠?qū)雡az.
classmethod與staticmethod
類(lèi)方法classmethod常用來(lái)創(chuàng)建一個(gè)類(lèi)的實(shí)例,非常像c++中的構(gòu)造函數(shù).
class C:
@staticmethod
def f(cls, arg1, arg2, ...): # 第一個(gè)參數(shù)為cls
cls_ = cls(arg1, arg2)
return cls_
靜態(tài)方法staticmethod可以被類(lèi)調(diào)用C.f()
或實(shí)例調(diào)用C().f()
.用于常駐內(nèi)存,并與實(shí)例無(wú)關(guān)的公共方法場(chǎng)景.
class C:
@staticmethod
def f(arg1, arg2, ...):
pass
uuid
uuid(UUID objects according to RFC 4122),工作中常使用uuid模塊來(lái)產(chǎn)生唯一通用標(biāo)示符,代表不同的用戶(hù).
import uuid
uuid1()
uuid2()
uuid3()
uuid4()
super()
調(diào)用父類(lèi)方法時(shí).
class C(B):
def method(self, arg):
super(C, self).method(arg)
等價(jià)于:
class C(B):
def method(self, arg):
super().method(arg)
super()
只能super().__getitem__(name)
來(lái)顯式調(diào)用方法,不能super()[name]
這樣的隱式調(diào)用.
isinstance(a, (b, c, d))
是下面方式的優(yōu)雅的表達(dá):
if type(a) in (b, c, d):
return True
else
return False
創(chuàng)建class
class X:
a = 1
等價(jià)于
X = type('X', (object,), dict(a=1))
class type(name, bases, dict)
name是類(lèi)名,bases是父類(lèi),dict是成員的字典.
字典類(lèi)型初始化
d = {'a':1}
d.get('b',2) # b不在字典d中,獲取時(shí)初始化b為2
locals()查看本地變量
注釋會(huì)在__doc__
出現(xiàn),申明的變量直接出現(xiàn),__file__
是文件絕對(duì)路徑.
{
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fbdc7a04278>,
'__doc__': '\n all is here\n',
'__file__': '/home/kushao1267/workspace/restless/restless/ss.py',
'a': [1, 2, 3], # 申明的變量
'__package__': None,
'__cached__': None,
'__name__': '__main__',
'__builtins__': <module 'builtins' (built-in)>,
'__spec__': None
}
zip與unzip
a = [1, 2, 3]
b = [4, 5, 6]
def zip_func(a, b):
"""
[1, 2, 3],[4, 5, 6] --> [(1, 4), (2, 5), (3, 6)]
"""
zip_ = list(zip(a, b))
return zip_
def unzip_func(zip_):
"""
[(1, 4), (2, 5), (3, 6)] --> [(1, 2, 3), (4, 5, 6)]
"""
a, b = list(zip(*zip_)) # zip(*) 是解壓
return list(a), list(b)
if __name__ == '__main__':
zip_ = zip_func(a, b)
a, b = unzip_func(zip_)
print(zip_, a, b)
關(guān)鍵詞使用
常常在開(kāi)發(fā)中使用python已有的關(guān)鍵詞,例如class,type,所以我們常常用class_
,type_
以區(qū)分,因?yàn)閏lass和type都是對(duì)象,能夠被賦值,后面coding時(shí)容易出現(xiàn)錯(cuò)誤.
try...except...else語(yǔ)句
try:
todo
except:
# catch Exception
else:
todo # try未觸發(fā)異常時(shí)執(zhí)行此處
python下的路徑
import os
def function():
print(os.path.abspath(__file__)) # 當(dāng)前腳本所在絕對(duì)路徑
print(os.path.dirname(os.path.abspath(__file__))) # 當(dāng)前腳本所在的路徑
print(os.path.dirname(os.path.dirname(
os.path.abspath(__file__)))) # 當(dāng)前腳本所在的上移級(jí)路徑
if __name__ == '__main__':
function()
輸出為
/home/kushao1267/ss_work/test.py
/home/kushao1267/ss_work
/home/kushao1267
[Finished in 0.3s]
所以,__file__
代表即為當(dāng)前腳本文件,os.path.abspath()
方法獲取一個(gè)文件的絕對(duì)路徑,os.path.dirname()
獲取其路徑名或上一級(jí)路徑名.
itertools的chain()
很多時(shí)候需要對(duì)不同的容器中的對(duì)象進(jìn)行相同處理
import itertool
a = [1,2,3]
b= [3,4,5]
for i in itertool.chain(a,b):
print(i)
而下面的方式內(nèi)存消耗將會(huì)大很多,因?yàn)闀?huì)創(chuàng)建a+b的一個(gè)容器
for i in a+b:
print(i)
with語(yǔ)句
with語(yǔ)句的上下文context是通過(guò)棧來(lái)實(shí)現(xiàn)嵌套的.
比如:
with A() as a, B() as b:
suite
等價(jià)于
withA()asa:
withB()asb:
suite
上下文管理器contextmanager
@contextlib.contextmanager 修飾器可用于with語(yǔ)句中,且免于自己定義__enter__()
和__exit__()
方法
例如:
fromcontextlibimportcontextmanager
@contextmanager
deftag(name):
print("<%s>"%name)//此處的code相當(dāng)于__enter__()
yield//等待todo語(yǔ)句完成
print("</%s>"%name)//此處的code相當(dāng)于__exit__()
>>>withtag("h1"):
... print("foo")//todo語(yǔ)句
...
<h1>
foo
</h1>
上下文裝飾器ContextDecorator
定義上下文裝飾器
from contextlib import ContextDecorator
class mycontext(ContextDecorator):
def __enter__(self):
print('Starting')
return self
def __exit__(self, *exc):
print('Finishing')
return False
裝飾器方式如下:
>>> @mycontext()
... def function():
... print('The bit in the middle')
...
>>> function()
Starting
The bit in the middle
Finishing
with語(yǔ)句方式如下:
>>> with mycontext():
... print('The bit in the middle')
...Starting
The bit in the middle
Finishing
function()中的內(nèi)容將在繼承ContextDecorator的裝飾器mycontext()的__enter__()
與__exit__()
之間執(zhí)行.