Python元類

類也是對象

在Python中一切都是對象凄鼻,類也不例外。所以可以對類進行以下操作。
1.可以當做參數(shù)傳遞
2.可以添加屬性
3.可以賦給變量

代碼如下:

#coding=utf-8
class Person():
pass

# 可以賦值
print(Person())
p = Person()
print(p)

# 可以當做參數(shù)傳遞
def printClass(patern):
print(patern)
printClass(Person())

# 可以添加屬性

Person.name = 'Python'
print(Person.name)

運行結果如下:

type

type其實就是元類,type的作用有兩個梅肤,第一是查看對象的類型(也可以理解為這個對象是由什么創(chuàng)建創(chuàng)建出來的),第二是可以創(chuàng)建類
代碼如下:

#coding=utf-8
class Person():
pass

print(type(Person))
print(type(type(Person)))

運行結果如下:

所以我們可以知道所有的類都是由type創(chuàng)建出來的邑茄,如果print(type(type))姨蝴,最終顯示的還是type(這里應該是采用了一個遞歸的方式)

使用type創(chuàng)建類

代碼如下:

#coding=utf-8
Test1Class = type('Test1',(),{})
test1 = Test1Class()
print(test1)

Test2Class = type('Test2',(Test1Class,),{'num':100})
test2 = Test2Class()
print(test2)
print(test2.num)

def __init__(self,age):
self.age = age

def instancemethod(self,name):
print('實例方法')
print(name)
print(self.age)

@classmethod
def classmethod(cls):
print('類方法')
cls.numtest3 = 300

@staticmethod
def staticmethod():
print('hello world')
#print(numtest3)


Test3Class = type('Test3',(Test2Class,),{'__init__':__init__,'instance':instancemethod,'class3':classmethod,'static':staticmethod,'numtest3':200})
test3 = Test3Class(18)
print(test3)
print(test3.instance('xiaohua'))
print(test3.numtest3)
print(test3.class3())
print(test3.static())
print(test3.num)
print(test3.numtest3)

運行結果如下:

metaclass

class中的變量__metaclass__可以來決定類是由誰來創(chuàng)建
代碼如下:

#coding=utf-8

class UpperAttrMetaClass(type):
#__new__方法默認需要傳cls參數(shù)、后面三個參數(shù)依次代表:類名肺缕,類的集成似扔,類的屬性。默認由系統(tǒng)傳遞
def __new__(cls,future_class_name,future_class_parents,future_class_attr):
# 取出future_class_attr中屬性名以__開頭的搓谆,并保存在attrs這個元組中
attrs = ((name,value) for name,value in future_class_attr.items() if not name.startswith('__'))
# 將attrs元組再解開然后將其中name改為大寫炒辉,改成字典保存到uppercase_attrs中
uppercase_attrs = dict((name.upper(),value) for name,value in attrs)

# 1.通過type來做類對象的創(chuàng)建
# return type(future_class_name,future_class_parents,uppercase_attrs)

# 2.通過復用type.__new__的方法來創(chuàng)建類對象
# return type.__new__(cls,future_class_name,future_class_parents,future_class_attr)

# 3.通過super方法創(chuàng)建類對象
return super(UpperAttrMetaClass,cls).__new__(cls,future_class_name,future_class_parents,future_class_attr)

# python2用法,python3也能用
class Foo(object):
__metaclass__ = UpperAttrMetaClass
bar = 'bip'

# python3用法
# class Foo(object,metaclass = UpperAttrMetaClass):
# bar = 'bip'

# hasattr用來檢測類中是否有某屬性
print(hasattr(Foo,'bar'))
print(hasattr(Foo,'BAR'))

Python做了如下的操作:

  1. Foo中有metaclass這個屬性嗎泉手?如果是黔寇,Python會通過metaclass創(chuàng)建一個名字為Foo的類(對象)
  2. 如果Python沒有找到metaclass,它會繼續(xù)在Bar(父類)中尋找metaclass屬性斩萌,并嘗試做和前面同樣的操作缝裤。
  3. 如果Python在任何父類中都找不到metaclass,它就會在模塊層次中去尋找metaclass颊郎,并嘗試做同樣的操作憋飞。
  4. 如果還是找不到metaclass,Python就會用內(nèi)置的type來創(chuàng)建這個類對象。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姆吭,一起剝皮案震驚了整個濱河市榛做,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖检眯,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厘擂,死亡現(xiàn)場離奇詭異,居然都是意外死亡锰瘸,警方通過查閱死者的電腦和手機刽严,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來避凝,“玉大人舞萄,你說我怎么就攤上這事」芟鳎” “怎么了鹏氧?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佩谣。 經(jīng)常有香客問我,道長实蓬,這世上最難降的妖魔是什么茸俭? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮安皱,結果婚禮上调鬓,老公的妹妹穿的比我還像新娘。我一直安慰自己酌伊,他們只是感情好腾窝,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著居砖,像睡著了一般虹脯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奏候,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天循集,我揣著相機與錄音,去河邊找鬼蔗草。 笑死咒彤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的咒精。 我是一名探鬼主播镶柱,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼模叙!你這毒婦竟也來了歇拆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎查吊,沒想到半個月后谐区,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡逻卖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年宋列,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片评也。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡炼杖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盗迟,到底是詐尸還是另有隱情坤邪,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布罚缕,位于F島的核電站艇纺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邮弹。R本人自食惡果不足惜黔衡,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腌乡。 院中可真熱鬧盟劫,春花似錦、人聲如沸与纽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽急迂。三九已至影所,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僚碎,已是汗流浹背型檀。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留听盖,地道東北人胀溺。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像皆看,于是被迫代替她去往敵國和親仓坞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 類也是對象腰吟,在理解元類之前无埃,你需要先掌握Python中的類徙瓶。Python中類的概念借鑒于Smalltalk,這顯得...
    雲(yún)凌禹閱讀 452評論 0 3
  • 1. 類也是對象 在大多數(shù)編程語言中嫉称,類就是一組用來描述如何生成一個對象的代碼段侦镇。在Python中這一點仍然成立:...
    ztfdeveloper閱讀 296評論 0 0
  • 在大多數(shù)編程語言中,類就是一組用來描述如何生成一個對象的代碼段织阅。在Python中這一點仍然成立類也是對象壳繁。但是,P...
    壁花燒年閱讀 320評論 0 0
  • 1.元類 1.1.1類也是對象 在大多數(shù)編程語言中荔棉,類就是一組用來描述如何生成一個對象的代碼段闹炉。在Python中這...
    TENG書閱讀 1,270評論 0 3
  • 神的孩子全跳舞嗎?我在昨晚看到任航自殺的消息后想到了這句話且對此產(chǎn)生了懷疑润樱。最早聽說這本書不是因為村上渣触,而是因...
    草木乾坤閱讀 330評論 0 9