国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 甘德县| 崇文区| 泰宁县| 乐陵市| 罗源县| 佛冈县| 潮安县| 台湾省| 天祝| 芒康县| 石首市| 始兴县| 积石山| 安远县| 饶河县| 舟山市| 青海省| 乐都县| 香河县| 新疆| 天全县| 津南区| 南京市| 乌苏市| 揭阳市| 平原县| 贵州省| 林甸县| 蒲城县| 荣成市| 石渠县| 八宿县| 孙吴县| 南郑县| 黄大仙区| 札达县| 迭部县| 调兵山市| 额敏县| 龙口市| 桂林市|