python中的元類

2021-08-20 09:30:06 字數 4913 閱讀 2609

python中的元類大家都可能比較很陌生,因為大家都聽說過99%的情況下是用不到元類的,但是大家對類確很了解,大家都知道在python中萬物皆物件,那麼python中的類是不是物件呢?

物件的樣子:

1,物件可以在程式中動態的進行建立,python的語言動態特性。

2,物件可以通過__class__獲取該物件所屬的類。

3,物件可以動態的新增屬性,方法。

4,可以使用type檢視物件的型別。

classperson(object):

passclassstudent(object):

passclassstudent_son(student):

passinput_text = input('輸入person,建立person,輸入student,建立student。。。')

ifinput_text == 'person':

obj = person()

elifinput_text == 'student':

obj = student()

else:

obj = student()

看上面的**,三個類實現了動態建立,所以非常滿足第一條物件的樣子。再看下面的**,就可以看到person類完全符合物件的樣子2,3,4。

classperson(object):

def__init__(self):

passp = person()

print(person.__class__)

person.name = '**'

person.sayname =lambdaa : print('我的名字是'

, a)

person.sayname(person.name)

print(type(person))

執行結果:

<class'type'>

我的名字是 **

<class'type'>

也就是說:

1,類可以在程式中動態的建立。

2,類可以通過__class__獲取該物件所屬的類。

3,類是可以動態的新增屬性和方法。

4,類可以使用type檢視該物件的型別。

可能我花費了很多時間和精力來證明,類也是物件:

defcreate_class(class_name):

ifclass_name == 'person':

classperson(object):

def__init__(self):

print('我是person')

returnperson

elifclass_name == 'student':

classstudent(object):

def__init__(self):

print('我是student')

returnstudent

elifclass_name == 'studentson':

classstudentson(object):

def__init__(self):

print('我是studentson')

returnstudentson

else:

print('無法建立'

, class_name)

class_create = create_class('student')

print(class_create.__class__)

class_create.gender = '男'

class_create.sayhello =lambda: print('hello world')

print(class_create.gender)

class_create.sayhello()

print(type(class_create))
執行結果:

<class'type'>

男hello world

<class'type'>
那麼結論就是:

python中的類,本質上也是乙個物件,type就是元類,就是建立類的類.

這個類就是我們所說的type,從源開始說的話,我們中國有一句古話叫做:道生一,一生二,二生三,三生萬物,而這句古話特別吻合我們所說的元類到類,在到物件和屬性方法。也就是說,道就是元類,類物件(metaclass)是二,物件是三,物件的屬性和方法是萬物。是不是特別吻合,好吧佩服一下咱們老祖宗的智慧型把。

type的用法:

1,檢視當前物件的型別

2,建立類

語法:type(類名,繼承父類的元組,包含屬性的字典)

person = type('person'

, (object

,), {})

student = type('student'

, (person

,), )

student = student()

print(type(student))

print(student.name)

student.say_hello()

以上**通過type建立乙個person類,然後建立的student類繼承了person,並且有字典的傳入,例項化的物件student繼承了name屬性和say_hello方法。

<class'__main__.student'>

張飛龍3,type原理:

使用type建立類,實際上是:

student = type()返回的乙個類物件

student = student()

所以,type實際上就是python中給我們提供的元類。

4.自定義元類:

你可以在寫乙個類的時候為其新增__metaclass__屬性,定義了__metaclass__就是定義了這個類的元類。

語法:class person(__metaclass = somecode):somecode 必須返回乙個類

pass

作用:可以讓建立出來的類符合自己想要的標準

執行流程:

首先查詢當前類中是否有__metaclass__,如果有,則在記憶體中建立person這個類物件。

如果當前類沒有,則去父類中查詢是否有__metaclass__.如果有,則建立類物件 。

如果當前類的父類中也沒有__metaclass__。則去當前模組中找。

如果模組中也沒有,則使用type進行建立person類物件

# 要求,建立出的所有類,除了私有屬性外,其餘屬性都要大寫

defupper_attr(class_name, class_parent, class_attrs):

# 這個字典用來儲存屬性和值

attrs = {}

forname, valueinclass_attrs.items():

if notname.startswith('__'):

attrs[name.upper()] = value

returntype(class_name, class_parent, attrs)

classmyclass(object

, metaclass=upper_attr):

def__init__(self

, name, age):

self.name = name

self.age = age

test1 = 'test'

a = 'a'

__b = 'b'

bb = 'bb'

green = '綠色'

my_class = myclass()

print(hasattr(myclass,

'a'))

print(hasattr(myclass,

'a'))

在上面的例子中,我們定義了乙個upper_attr函式用來返回乙個類,而這個類作為我們接下來定義的myclass類的元類,這個元類的元類就是type,因為它是type()函式裡出來的,在upper_attr裡我們把他本身的方法修改了大寫。最後執行**:

falsetrue

Python 中的元類

如果看完以後還是感覺莫名其妙,執行這樣乙個demo 可能會對你有所幫助 元類程式設計在我看來,如果你想開發一些框架,可以嘗試一下 class upperattrmetaclass type type dict def new cls,cls name,bases,attr dict news cls...

python中的元類

目錄其他 我們建立乙個類目的是為了建立該類的例項物件,而元類就是用來建立類的。換個理解方式就是,元類就是建立類的類。在python中可以使用type函式建立乙個類,參考 python中type的用法 用法如下 tpye name,bases,dict 實際上type 函式就是乙個元類,是python...

Python中的元類 metaclass

在wiki上面,metaclass是這樣定義的 in object oriented programming,a metaclass is a class whose instances are classes.python中物件模型如下圖 其中,實線表示 is kind of 派生 的關係,虛線表...