元類的概念
元類是類的類,是類的模板
元類是用來控制如何建立類的,正如類是建立物件的模板一樣
元類的例項是類,正如類的例項為物件
type是python的乙個內建元類,用來直接控制生成類,python中class定義的類其實都是type類例項化的物件
產生類的兩種方式
類的產生有兩種方式,這兩種方式產生的類的本質是一樣的
class
foo:
x =1ffo =
type
("ffo",(
object,)
,)print
(foo)
print
(ffo)
如果乙個類沒有宣告自己的元類,預設它的元類就是type,除了使用type,使用者也可以通過繼承來自定義元類
class
foo:
def__init__
(self, name, age)
: self.name = name
self.age = age
x =1def
__init__
(self, name, age)
: self.name = name
self.age = age
ffo =
type
("ffo",(
object,)
,)#三個引數分別是 類名 、繼承的類(元組形式)、類內屬性
f1 = foo(
"mb",18
)f2 = ffo(
"cjj",18
)print
(f1)
print
(f2)
自定義元類
#metaclass的本質
class
foo(metaclass=
type):
# type("foo", (object,), {})
def__init__
(self, a, b, c)
: self.a = a
self.b = b
self.c = c
可以定義乙個新的元類,利用metaclass引數宣告元類
class
mytype
(type):
def__init__
(self, a, b, c)
:#需要四個引數
self.a = a
self.b = b
self.c = c
class
foo(metaclass=mytype)
:#這裡相當於foo = foo(self, "foo", (object,),{}) (這裡的self也是foo,因為賦值給了foo),相當於執行mytype的__init__()函式,相當於讓mytype產生乙個例項賦值給foo
def__init__
(self, name)
: self.name = name
p1 = foo(
"alex"
)#這裡的例項化相當於執行的mytype中預設的__call__()方法
print
(p1.name)
print
(foo)
print
(p1)
這裡使用foo產生例項相當於呼叫的元類的__call__()方法,所以想要定製元類還需要重寫元類的__call__()方法
class
mytype
(type):
def__init__
(self, a, b, c)
: self.a = a
self.b = b
self.c = c
def__call__
(self,
*args,
**kwargs)
: obj =
object
.__new__(self)
#這一步相當於產生乙個物件,這個物件中現在什麼都沒有,之後將這個物件中封裝屬性最終賦值給給定的變數
self.__init__(obj,
*args,
**kwargs)
#為了在例項化的時候自定執行類的__init__方法,需要在元類的__call__()方法中寫入執行__init__()方法
return obj
class
foo(metaclass=mytype)
:def
__init__
(self, name)
: self.name = name
p1 = foo(
"alex"
)print
(p1.name)
print
(foo)
print
(p1)
類 友元函式 友元類
友元函式不是當前類的成員函式,但它可以訪問該類所有的成員,包括私有成員 保護成員和公有成員。在類中宣告友元函式時,需在其函式名前加上關鍵字 friend。友元函式既可以是非成員函式,也可以是另乙個類的成員函式。class date date date int y,int m,int d void s...
自定義元類控制類的建立
chinese每次建立由原來的type改為mymeta,因此可以在mymeta內對類進行一些特殊定製 示例一 類名的大小寫強控 class mymeta type def init self,class name,class bases,class dic if not class name.ist...
python元類的使用 Python的元類如何使用
這次給大家帶來python的元類如何使用,使用python元類的注意事項有哪些,下面就是實戰案例,一起來看一下。今天我的任務就是徹底明白什麼是元類,一起看看。要搞懂元類,我們還是先從物件說起。python 一切皆物件,這句話你一定有聽說過 現在你就聽說了 乙個數字是物件,乙個字串是物件,乙個列表是物...