>>>
class
obj(object):
… pass
…>>> my_obj= obj()
>>>
print my_obj
<__main__.obj obj at 0x8974f2c>
但是在python類還遠不止如此。類同樣也是一種物件。是的,沒錯,就是物件。只有你使用關鍵字class,python直譯器在執行的時候就會建立乙個物件。
>>>
defchoose_class
(name):
if name == 'foo':
class
foo(object):
pass
return foo # 返回的是類,不是類的例項
else:
class
bar(object):
pass
return bar
>>> myclass = choose_class('foo')
>>>
print myclass # 函式返回的是類,不是類的例項
>>> print
myclass
() # 你可以通過這個類建立類例項,也就是物件
<__main__.foo
object
at 0x89c6d4c>
但這不夠動態,因為你仍然需要自己編寫整個類的**。由於類也是物件,所以它們必須是通過什麼東西來生成的才對。當你使用class關鍵字時,python直譯器自動建立這個物件。但就和python中的大多數事情一樣,python仍然提供給你手動處理的方法。還記得內建函式type嗎?這個古老但強大的函式就夠讓你知道乙個物件的型別是什麼:
>>>
print type(1)
'int'>
>>>
print type("1")
'str'>
>>>
print type(objectcreator)
'type'>
>>>
print type(objectcreator())
type有一種完全不同的功能,它也能動態的建立類。
type可以接受乙個類的描述作為引數,然後返回乙個類。(可能你會覺得根據傳入引數的不同,同乙個函式擁有兩種完全不同的用法是一件很傻的事情,但這在python中是為了保持向後相容性)
tpye可以像這樣工作:
type(類名,由父類名稱組成的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))
test2 = type("test2",(),{}) #定了乙個test2類
in [5]: test2() #建立了乙個test2類的例項物件
out[5]: <__main__.test2 at 0x10d406b38>
>>> foo = type("foo",(),)
可以翻譯為:
>>> class foo(object):
... bar = true
說明:type的第2個引數,元組中是父類的名字,而不是字串。新增的屬性的類屬性,並不是例項屬性
def
echo_bar
(self):
print
(self.bar)
#讓foochild類中的echo_bar屬性,指向了上面定義的函式
foochild = type
("foochild",(foo,),)
in [36]: @staticmethod
...: def
teststatic
(): ...: print("static method ....")
...:
in [37]: foochild = type('foochild', (foo,), )
in [38]: fooclid = foochild()
in [39]: fooclid.teststatic
out[39]:
in [42]: @classmethod
...: def
testclass
(cls):
...: print(cls.bar)
...:
in [43]: foochild = type('foochild', (foo,), )
myclass = metaclass()
myobject = myclass()
你已經看到了type可以讓你像這樣做:
myclass = type('myclass', (), {})
這是因為函式type實際上是乙個元類。type就是python在背後用來建立所有類的元類。現在你想指定為什麼type全部採用小寫形式而不是type呢?好吧這是為了和str保持一致性,str是用來建立字串物件的類,而int是用來建立整數物件的類。type就是建立類物件的類。你可以通過檢查__class__
屬性來看到這一點。python中所有的東西,注意,我是指所有的東西–都是物件。這包括整數、字串、函式以及類。它們全部都是物件。而它們都是乙個類建立而來。
常用專有屬性
說明觸發方式
__init__
構造初始化函式
建立例項後,賦值時使用,在__new__
後
__new__
生成例項所需屬性
建立例項時
__class__
例項所在的類
例項.__class__
__str__
例項字串表示,可讀性
print(類例項),如沒實現,使用repr結果
__repr__
例項字串表示,準確性
類例項 回車 或者 print(repr(類例項))
__del__
析構
del刪除例項
__dict__
例項自定義屬性
vars(例項.__dict__
)
__doc__
類文件,子類不繼承
help(類或例項)
__getattribute__
屬性訪問***
訪問例項屬性時
__bases__
類的所有父類構成元素
類名.__bases__
標準庫說明
builtins
內建函式預設載入
os作業系統介面
syspython自身的執行環境
functools
常用的工具
json
編碼和解碼 json 物件
logging
記錄日誌,除錯
multiprocessing
多程序threading
多執行緒copy
拷貝time
時間datetime
日期和時間
calendar
日曆hashlib
加密演算法
random
生成隨機數
re字串正則匹配
socket
標準的 bsd sockets api
shutil
檔案和目錄管理
glob
基於檔案萬用字元搜尋
擴充套件庫說明
requests
使用的是 urllib3,繼承了urllib2的所有特性
urllib
基於http的高層庫
scrapy
爬蟲beautifulsoup4
html/xml的解析器
celery
分布式任務排程模組
redis
快取pillow(pil)
影象處理
xlsxwriter
僅寫excle功能,支援xlsx
xlwt
僅寫excle功能,支援xls ,2013或更早版office
xlrd
僅讀excle功能
elasticsearch
全文搜尋引擎
pymysql
資料庫連線庫
mongoengine/pymongo
mongodbpython介面
matplotlib
畫圖numpy/scipy
科學計算
django/tornado/flask
web框架
xmltodict
xml 轉 dict
簡單地http server,不使用web框架
gevent
基於協程的python網路庫
fabric
系統管理
pandas
資料處理庫
scikit-learn
機器學習庫
Python高階程式設計 元類程式設計
class people def init self,name self.name name property defname self return self.name name.setter defname self,value self.name value getattr 是在找不到屬性的時...
python高階 物件導向程式設計六 元類
typer produce class produce obj type稱謂元類,是所有類的類,利用type控制類的行為 模擬class關鍵字建立類的過程 建立類的兩種方式 方式一 class foo def func self print from func 方式二 x 1 def func se...
python高階 元類
1.1 什麼是元類 元類就是用來建立類的 東西 python中類也是一種物件 定義乙個類 python直譯器在執行的時候會建立乙個物件 class ai object pass print type ai 1.2 使用type建立類 type可以動態的建立類 type 類名,由父類名組成的元組,屬性...