python元類分析

2021-09-09 04:19:03 字數 2369 閱讀 2584

剛開始接觸到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...