python中的type,元類,類,對象用法
type,元類,類,對象
簡單描述
1.type是python內建元類,新建的元類需要繼承type
2.元類用來創建類,類用來創建對象
類的生成方式
傳統定義通過聲明關鍵字class
#1.創建Person類 #2.繼承object #3.擁有屬性eat class Person(object): def eat(self,food="rice"): print("eat %s"%food) p = Person() p.eat(food="fruits")
通過type生成
註:該方法一般很少用,一般先由type生成元類,再有元類生成類,由類衍生出對象實例
def eat(self,food="rice"): print("eat %s"%food) People = type("People",(object,),{"eat":eat}) #People = type("People",(object,),dict(eat=eat)) p = People() p.eat()
元類
一般來說元類均被命名為以MetaClass為後綴,元類是由type衍生出來,所以需繼承type,元類的操作都在new方法中完成,new方法在init方法之前調用
示例一
#方式1,使用lambda匿名函數 class LanguageMetaClass(type): def __new__(cls, name, bases, attrs): attrs['speak'] = lambda self:print(self.language) return type.__new__(cls,name,bases,attrs) #方式2,使用預定義的函數 def speak(self): print("speak %s"%self.language) #創建元類LanguageMetaClass class LanguageMetaClass(type): def __new__(cls, name, bases, attrs): attrs['speak'] = speak #return type.__new__(cls,name,bases,attrs) return super(LanguageMetaClass,cls).__new__(cls.name,bases,attrs) #使用創建好的元類創建類(python2.x與3.x方式不一致) #python2.x #默認新式類由type()構造,當在類中定義瞭__metaclass__則由其構建,__metaclass__查找順序: #1.查找自身的__metaclass__屬性 #2.如果有父類,查找父類的__metaclass__(通過父類.__class__屬性獲取) #3.如果沒有父類,查找模塊中的__metaclass__ class People(object): __metaclass__ = LanguageMetaClass def __init__(self,language="chinese"): self.language = language #python3.x #默認新式類由type()構造,可以通過指定metaclass關鍵字參數後,則由metaclass構造 class People(object,metaclass=LanguageMetaClass): def __init__(self,language="chinese"): self.language = language p1 = People(language="English") p1.speak() #speak English p2 = People() p2.speak() #speak chinese
示例二
#創建元類AddMetaClass class AddMetaClass(type): def __new__(cls,name,bases,attrs): attrs['add'] = lambda self,value:self.append(value) return type.__new__(cls,name,bases,attrs) #python2.x class MyList(list): #MyLIST在list的基礎上多瞭個add方法 __metaclass__ = AddMetaClass pass #python3.x class MyList(list,metaclass=AddMetaClass): #MyLIST在list的基礎上多瞭個add方法 pass list1 =MyList() list1.add(1) print(list1) #[1] list1.add(2) print(list1) #[1,2]
元類type學習總結
type是元類,也就是python中所有的類其實本質上都是type這個類的實例化後的對象。
type的作用是幹什麼呢?
1、我們直接type()來判斷一個對象的類型
type不是一個類嗎?為什麼可以直接去調用呢?因為type類其實也是一個對象,是自己的類的對象,而type類中實現瞭__cal__()這個方法,我們知道隻要實現瞭__cal__()這個方法的類,那麼該類實例化的對象就可以直接被調用,也就是可調用對象,即callable。
下面給個例子:
print(type(1)) print(type('abc')) print(type([]))
運行結果:
<class 'int'>
<class 'str'>
<class 'list'>
其實判斷一個對象的類型,還可以通過isinstance()來判斷。
print(isinstance((),tuple)) print(isinstance('abc',str)) print(isinstance([],list))
運行結果:
True
True
True
2、type的第二個作用就是:創建類
其實這個不常用,一般我們都是使用class去調用,而不是使用type;
比如像下面這種:
type("Foo", (object,), {"a":1})
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Python深入淺出分析元類
- 關於Python 多重繼承時metaclass conflict問題解決與原理探究
- python中的元類metaclass詳情
- python語法學習之super(),繼承與派生
- Python黑魔法之metaclass詳情