一、類是如何產(chǎn)生的
- 表面上使用繼承創(chuàng)建一個(gè)類
- 所有類都直接或間接繼承于object
而真正創(chuàng)建類的是type - type
type通常的用法--判斷對(duì)象的類型
但除此之外揩慕,它最大的用途是來(lái)動(dòng)態(tài)的創(chuàng)建類缝彬,當(dāng)Python掃描到class語(yǔ)法的時(shí)候生棍,就會(huì)調(diào)用type函數(shù)進(jìn)行類的創(chuàng)建 - type 創(chuàng)建類
- type()需要接受三個(gè)參數(shù)
- 1.類的名稱:若不指定也要傳入空字符串
- 2.父類:注意以tuple的形式傳入寺鸥,沒(méi)有也要傳入控tuple:()丑掺,默認(rèn)的是object
- 3.綁定的方法或?qū)傩裕鹤⒁庖詃ict的形式傳入
# 定義一個(gè)父類
class Parent:
def foo(self):
print('Parent')
# 準(zhǔn)備一個(gè)方法
def say(self):
print('hello')
# 使用type來(lái)創(chuàng)建一個(gè)類
Person = type('Person',(Parent,),{'name':'person','say':say})
p = Person()
p.foo()
p.say()
# 結(jié)果
Parent
hello
元類
- 類 -用來(lái)創(chuàng)建對(duì)象的模板
- 那么获印,元類就是創(chuàng)建類的模板
- type就是一個(gè)元類
就連 object 也是由type創(chuàng)建的
哈哈,就連type自己也是type創(chuàng)建的
In [1]: type(type)
Out[1]: type
In [2]: type(object)
Out[2]: type
In [3]: type(int)
Out[3]: type
In [4]: type(str)
Out[4]: type
In [5]: type(bool)
Out[5]: type
In [6]: type(list)
Out[6]: type
- 有點(diǎn)神奇樣
- str:用來(lái)創(chuàng)建字符串對(duì)象的類
- int:用來(lái)創(chuàng)建整數(shù)對(duì)象的類
- type:用來(lái)創(chuàng)建類對(duì)象的類
- 等等...
示例
# 繼承type
class Base(type):
def __new__(cls,*args,**kwargs):
print('in Base')
return super().__new__(cls,*args,**kwargs)
class Person(metaclass=Base):
def __init__(self,name):
self.name = name
p = Person('tom')
# 控制臺(tái)
in Base