python中的元類大家都可能比較很陌生,因為大家都聽說過99%的情況下是用不到元類的,但是大家對類確很了解,大家都知道在python中萬物皆物件,那麼python中的類是不是物件呢?
物件的樣子:
1,物件可以在程式中動態的進行建立,python的語言動態特性。
2,物件可以通過__class__獲取該物件所屬的類。
3,物件可以動態的新增屬性,方法。
4,可以使用type檢視物件的型別。
classperson(object):看上面的**,三個類實現了動態建立,所以非常滿足第一條物件的樣子。再看下面的**,就可以看到person類完全符合物件的樣子2,3,4。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()
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'以上**通過type建立乙個person類,然後建立的student類繼承了person,並且有字典的傳入,例項化的物件student繼承了name屬性和say_hello方法。, (object
,), {})
student = type('student'
, (person
,), )
student = student()
print(type(student))
print(student.name)
student.say_hello()
<class'__main__.student'>在上面的例子中,我們定義了乙個upper_attr函式用來返回乙個類,而這個類作為我們接下來定義的myclass類的元類,這個元類的元類就是type,因為它是type()函式裡出來的,在upper_attr裡我們把他本身的方法修改了大寫。最後執行**:張飛龍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'))
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 派生 的關係,虛線表...