1. 程式人生 > >類的兩種創建方式(通過元類創建類)

類的兩種創建方式(通過元類創建類)

通過 默認 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()

類的兩種創建方式(通過元類創建類)