国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Python中的元類(metaclass)

2020-02-23 06:25:22
字體:
供稿:網(wǎng)友

譯注:這是一篇在Stack overflow上很熱的帖子。提問者自稱已經(jīng)掌握了有關(guān)Python OOP編程中的各種概念,但始終覺得元類(metaclass)難以理解。他知道這肯定和自省有關(guān),但仍然覺得不太明白,希望大家可以給出一些實際的例子和代碼片段以幫助理解,以及在什么情況下需要進行元編程。于是e-satis同學(xué)給出了神一般的回復(fù),該回復(fù)獲得了985點的贊同點數(shù),更有人評論說這段回復(fù)應(yīng)該加入到Python的官方文檔中去。而e-satis同學(xué)本人在Stack Overflow中的聲望積分也高達64271分。以下就是這篇精彩的回復(fù)(提示:非常長)

類也是對象

在理解元類之前,你需要先掌握Python中的類。Python中類的概念借鑒于Smalltalk,這顯得有些奇特。在大多數(shù)編程語言中,類就是一組用來描述如何生成一個對象的代碼段。在Python中這一點仍然成立:
代碼如下:
>>> class ObjectCreator(object):
…       pass

>>> my_object = ObjectCreator()
>>> print my_object
<__main__.ObjectCreator object at 0x8974f2c>

但是,Python中的類還遠不止如此。類同樣也是一種對象。是的,沒錯,就是對象。只要你使用關(guān)鍵字class,Python解釋器在執(zhí)行的時候就會創(chuàng)建一個對象。下面的代碼段:
代碼如下:
>>> class ObjectCreator(object):
…       pass


將在內(nèi)存中創(chuàng)建一個對象,名字就是ObjectCreator。這個對象(類)自身擁有創(chuàng)建對象(類實例)的能力,而這就是為什么它是一個類的原因。但是,它的本質(zhì)仍然是一個對象,于是乎你可以對它做如下的操作:

1.你可以將它賦值給一個變量
2.你可以拷貝它
3.你可以為它增加屬性
4.你可以將它作為函數(shù)參數(shù)進行傳遞

下面是示例:
代碼如下:
>>> print ObjectCreator     # 你可以打印一個類,因為它其實也是一個對象
<class '__main__.ObjectCreator'>
>>> def echo(o):
…       print o

>>> echo(ObjectCreator)                 # 你可以將類做為參數(shù)傳給函數(shù)
<class '__main__.ObjectCreator'>
>>> print hasattr(ObjectCreator, 'new_attribute')
Fasle
>>> ObjectCreator.new_attribute = 'foo' #  你可以為類增加屬性
>>> print hasattr(ObjectCreator, 'new_attribute')
True
>>> print ObjectCreator.new_attribute
foo
>>> ObjectCreatorMirror = ObjectCreator # 你可以將類賦值給一個變量
>>> print ObjectCreatorMirror()
<__main__.ObjectCreator object at 0x8997b4c>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 中牟县| 玉环县| 彝良县| 浦城县| 莎车县| 金华市| 富锦市| 东乌珠穆沁旗| 庆云县| 塔城市| 棋牌| 贺兰县| 临澧县| 汉源县| 宁国市| 马公市| 会泽县| 巧家县| 鸡泽县| 东港市| 松桃| 望城县| 库尔勒市| 三原县| 类乌齐县| 达州市| 寻乌县| 鲜城| 嵊州市| 嘉善县| 芮城县| 吉水县| 宁乡县| 永吉县| 楚雄市| 日喀则市| 白沙| 乌什县| 石林| 广东省| 当雄县|