Python :: type 類別 - OpenHome.cc

文章推薦指數: 80 %
投票人數:10人

Python 可以使用類別來定義物件的藍圖,每個物件實例本身都有__class__ 屬性,參考至實例建構時使用之類別。

類別是type 實例類別本身也有__class__ ... OPENHOME.CC Python |起步走 Hello,Python 簡介模組 IO/格式/編碼 |內建型態 數值 字串 清單 集合 字典 tuple |基本運算 變數 算術運算 比較、指定、邏輯運算 位元運算 |流程語法 if分支判斷 while迴圈、for迭代 forComprehension 初試match/case |函式入門 定義函式 一級函式、lambda運算式 初探變數範圍 yield產生器 |封裝 類別入門 屬性與方法 屬性名稱空間 特殊方法 callable物件 |繼承 共同行為與isa 使用enum列舉 多重繼承與Mixin |例外處理 使用try、except 例外繼承架構 raise例外 使用else、finally 使用withas 使用assert |模組/套件 管理模組名稱 模組路徑 使用套件 |metaprogramming __slots__、__abstractmethods__、__init_subclass__ __getattribute__、__getattr__、__setattr__、__delattr__ 裝飾器 描述器 type類別 metaclass super與mro GitHub Twitter Facebook LinkedIn 2DDesigns 3DDesigns Tags BuiltwithbyHugo HOME> Python> metaprogramming> type類別 類別是type實例 透過type建立類別 metaprogramming type類別 May12,2022 Python可以使用類別來定義物件的藍圖,每個物件實例本身都有__class__屬性,參考至實例建構時使用之類別。

類別是type實例 類別本身也有__class__屬性,那麼它會參考至什麼? >>>classSome: ...pass ... >>>s=Some() >>>s.__class__ >>>Some.__class__ >>> 類別的__class__參考至type類別,類別也是一個物件,是type類別的實例。

在〈callable物件〉談過,類別可以定義__call__方法,讓類別實例成為callable物件,類別是type的實例,type定義了__call__方法,因此要建立類別實例,不需要使用new,而是像函式呼叫那,在類別名稱後接上圓括號,你也可以直接呼叫類別的__call__方法: >>>classSome: ...def__init__(self): ...print('__init__') ... >>>Some() __init__ <__main__.someobjectat0x000002708fef1fa0> >>>Some.__call__() __init__ <__main__.someobjectat0x000002708fef1190> >>> type定義了__call__,因此每個類別都會有__call__方法,其定義的行為中,會呼叫__new__、__init__,因此上例中會看到顯示了'__init__'。

透過type建立類別 既然每個類別都是type類別的實例,那麼有沒有辦法撰寫程式碼,直接使用type類別來建構出類別呢?可以!必須先知道的是,使用type類別建構類別時,必須指定三個引數,分別是類別名稱(字串)、類別的父類別(tuple)與類別的屬性(dict)。

如果如下定義類別的話: classSome: x=10 def__init__(self,arg): self.arg=arg defdoSome(self): self.arg+=1 Python在剖析完類別之後,會建立x名稱參考至10、建立__init__與doSome名稱分別參考至各自定義的函式,然後呼叫type建立實例,並指定給Some名稱,也就是類似於: >>>def__init__(self,arg): ...self.arg=arg ... >>>defdoSome(self): ...self.arg+=1 ... >>>x=10 >>>Some=type('Some',(object,),{'x':10,'__init__':__init__,'doSome':doSome}) >>>s=Some(100) >>>s.arg 100 >>> 在Python中,類別是type的實例,如果有方法能介入type建立實例與初始化的過程,就有辦法改變類別的行為,這就是meta類別的基本概念。

這與裝飾器的概念不同,要對類別使用裝飾器時,類別本身已經產生,也就是已經產生了type實例,然後才去裝飾類別的行為;meta類別是直接介入type建構與初始化類別的過程,時機點並不相同。



請為這篇文章評分?