一、python中如何創建類? 1. 直接定義類 2. 通過type對象創建 在python中一切都是對象 在上面這張圖中,A是我們平常在python中寫的類,它可以創建一個對象a。其實A這個類也是一個對象,它是type類的對象,可以說type類是用來創建類對象的類,我們平常寫的類都是type類創建 ...
一、python中如何創建類?
1. 直接定義類
class A:
a = 'a'
2. 通過type對象創建
在python中一切都是對象
在上面這張圖中,A是我們平常在python中寫的類,它可以創建一個對象a。其實A這個類也是一個對象,它是type類的對象,可以說type類是用來創建類對象的類,我們平常寫的類都是type類創建的對象,再由創建的對象再去創建我們平常使用的對象,我們可以看看type的官方文檔
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
type有另一種用法type(name, bases, dict)來創建類 中,name是這個類的名字,bases是這個類的基類(是一個元組),dict是這個類的屬性(是一個字典),我們通過type實現上面的例子中A類的創建
A = type('A', (), {'a': 'a'})
二、什麼是元類編程?
我們已經知道,類也是對象,那麼我們在創建類的時候,可不可以控制類的創建過程?當然是可以的,這就是元類編程。
三、如何實現元類編程?
1. 在要定義的類中使用__new__方法
class A: def __new__(cls, *args, **kwargs): cls.a = 'a' return super().__new__(cls, *args, **kwargs)
這樣就實現了創建A類的時候,添加了一個類屬性a(註意的是,__new__方法要返回一個創建的對象,當然,我們也可以返回其他東西;另一個註意點是__new__方法要在實例化的時候才會運行,所以,類屬性a必須是在A實例化後才會出現)
2. 使用metaclass關鍵字,使用metaclass關鍵字的時候,我們要定義一個type類
class B(type): def __init__(self, *args, **kwargs): self.a = 'a' super().__init__(*args, **kwargs) class A(metaclass=B): pass
我們定義了一個B類繼承type,在A類創建的時候傳遞關鍵字metaclass=B,就會執行B類種的代碼,控制A類的創建,這個例子也是為A類添加了一個類屬性a。我們還可以在B類中使用__init__,__call__方法。
四、總結
使用元類編程可以讓我們在創建類的時候,給類添加一些額外的信息。但元類編程是python中難以理解的地方之一,而且工作中,大部分時候都是不會用到的,我們普通的類定義方式就可以解決問題了,若果說有99%的時候你需要控制創建類的過程,那就使用元類編程吧。
理解元類,大家可以參考這篇文章 what are metaclass in python?