Python :: type 類別 - OpenHome.cc
文章推薦指數: 80 %
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__
在〈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建構與初始化類別的過程,時機點並不相同。
延伸文章資訊
- 1Python type Class
In Python, a class is an instance of the type class. The type class creates other classs, therefo...
- 2type() and isinstance() in Python with Examples - Guru99
Python has a built-in function called type() that helps you find the class type of the variable g...
- 3type of class in python - Stack Overflow
New-style classes were introduced in Python 2.2 to unify classes and types. A new-style class is ...
- 4python中type、class、object之間的關係 - 程式人生
得出如下結論,1是int型別,而int是一個type型別,int本身也是一個物件,是由type這個類來生成的. 所以關係如下:type----》》》int----》》》1.
- 514. Dynamically Creating Classes with type - Python Course Eu
A user-defined class (or the class "object") is an instance of the class "type". So, we can see, ...