類的兩種創建方式(通過元類創建類)
阿新 • • 發佈:2018-04-27
通過 默認 font HA self print pri div inf
首先我們需要明確一點:python中,一切皆對象
class Student:
pass
zhangsan = Student()
對象有什麽特點:
1.可以被引用
a = zhangsan
2.可以當作函數參數輸入
func(zhangsan)
3.可以當作函數的返回值
def func():
return zhangsan
4.都可以當做容器的元素
lis = ["hello, world", 1, zhangsan]
而我們定義的類也都使用這些特點,那麽我們把上述中的zhangsan換成Student也是可以的,由此得出結論:
類也是對象!!!
類既然是對象那麽它一定是有某個類實例化得到的,這個類就是元類
a = 5
print(type(a))
得到a是int類型
print(type(type(a)))
得到type類型,即int的類是type類,這個type就是我們要找的元類!
類的類是元類,type類
現在我們知道類也是通過元類實例化得到的,那麽以後我們自己是不是也可以通過元類創建類呢?
當然可以
方法一:直接創建類
class People: country = "China" def __init__(self, name, age): self.name = name self.age = age def tell_info(self):print(f"{self.name} is from {self.country}, and he is {self.age} years old") chen = People("chenjun", 21) chen.tell_info()
方法二:通過元類創建類
首先,我們需要構成類的三要素,作為元類的參數
參數1:類名,如上面的People
參數2:類的基類(父類),python3中,如果沒指定繼承的類,則默認繼承object類
參數3:名稱空間
那麽定義代碼如下:
class_name = "People" class_bases = (object,) class_dic = {} class_body= """ country = "China" def __init__(self, name, age): self.name = name self.age = age def tell_info(self): print(f"{self.name} is from {self.country}, and he is {self.age} years old") """ exec(class_body, globals(), class_dic) People = type(class_name, class_bases, class_dic) chen = People("chenjun", 21) chen.tell_info()
類的兩種創建方式(通過元類創建類)