python高階程式設計(六) 元類 內建屬性

2021-08-08 23:16:21 字數 4672 閱讀 8097

>>> 

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 類名,由父類名組成的元組,屬性...