<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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是元類,也就是python中所有的類其實本質上都是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})
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45