剛開始接觸到python新式類中的元類的概念的時候非常是糾結了下。。不知道這是個啥東西。。。
用下面幾個定義來說明吧:
(1)python中,類也是物件。。僅僅只是這樣的物件比較的特殊,他用於建立別的物件
(2)元類也是一種類,僅僅只是它更特殊。。。他是用來建立別的類的類。。。(呵呵,是不是非常拗口)
先來看一段**吧:
class fjs(object):
def __init__(self, name):
self.name = name
def hello(self):
print "hello by %s" % (self.name,)
print fjs.__class__
這裡的輸出是:
這裡該怎麼理解呢。。?依照上面說的。。。fjs類事實上也是一種物件。。。那麼fjs類物件是由什麼類來建立的呢。。?嗯。。就是由type類來建立的。。。
接下來來更改一下**,換一種方法來建立fjs型別:
def __init__(self, name):
self.name = name
def hello(self):
print "hello by %s" % (self.name,)
attrs = dict()
attrs["__init__"] = __init__
attrs["hello"] = hello
fjs = type("fjs", (object,), attrs)
fjs = fjs("fjs")
fjs.hello()
這裡也建立了fjs型別,跟上面定義的fjs型別是一樣的。。只是這裡換了一種定義的方式。。。
這裡就看出來了type這個類是幹啥用的了吧。。。
嗯,接下來引入元類的概念。。。。
在python中,型別的定義(新式類),事實上終於都是通過某個元類來建立乙個型別物件。。。。普通情況下,假設沒有特別指出。。。那麼預設的元類就是type。。。通過上面說的兩段**,應該可以比較清楚的理解這個問題吧。。。
接下來我們寫**來看看自己定義元類吧:
class meta_fjs(type):
def __init__(self, name, parents, attrs):
print "開始建立型別物件"
super(meta_fjs, self).__init__(name, parents, attrs)
class fjs(object):
__metaclass__ = meta_fjs
def __init__(self, name):
self.name = name
def hello(self):
print "hello by %s" % (self.name, )
這裡定義了乙個meta_fjs元類,它繼承了type,然後要做的事情,事實上也非常easy,就是呼叫type來建立型別物件就好了。。
在定義的fjs型別中,我們指定了這個類的__metaclass__屬性為剛剛建立的meta_fjs元類。。。
這樣,在建立fjs型別的時候,事實上就是通過meta_fjs來建立的了。。。。
當然這裡事實上沒有做什麼事情。。。接下來做一些略微實用的事情吧:
class meta_fjs(type):
def __init__(self, name, parents, attrs):
if "__str__" not in attrs:
raise typeerror("未定義__str__方法")
super(meta_fjs, self).__init__(name, parents, attrs)
class fjs(object):
__metaclass__ = meta_fjs
def __init__(self, name):
self.name = name
def hello(self):
print "hello by %s" % (self.name, )
這裡在建立型別的時候,就要求必需要有__str__方法,假設沒有的話,那麼將會丟擲異常,那麼在執行的時候,接下的fjs型別的定義就將會丟擲異常。。想要順利的通過,就需要在fjs的定義中增加__str__方法
到這裡為止,python的元類的大體上的一些概念就應該知道了吧。。。
事實上,普通情況下我們都不會用到元類相關的東西。。。只是在一些框架設計,api設計等地方的時候元類還是能夠發揮關鍵的資料的。。。
python 元類 python元類深入理解
1.python 中的類 在python中,類也是乙個物件,只不過這個物件擁有生成例項的能力,我們一般使用class 來定義乙個類,在python直譯器執行到這個地方的時候會自動建立出這個物件,python也為我們提供了手動建立類的方法,type type 這個方法對我們來說並不陌生,我們所熟知的用...
python元類的使用 Python的元類如何使用
這次給大家帶來python的元類如何使用,使用python元類的注意事項有哪些,下面就是實戰案例,一起來看一下。今天我的任務就是徹底明白什麼是元類,一起看看。要搞懂元類,我們還是先從物件說起。python 一切皆物件,這句話你一定有聽說過 現在你就聽說了 乙個數字是物件,乙個字串是物件,乙個列表是物...
python 元類程式設計 python的元類程式設計
一 property動態屬性 給類中的乙個方法函式加上 property裝飾器,將這個方法變成屬性描述符,將獲取方法變為獲取屬性。class user def init self,name,birthday self.name name self.birthday birthday property...