类的两种创建方式(通过元类创建类)
Posted Tarantino
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的两种创建方式(通过元类创建类)相关的知识,希望对你有一定的参考价值。
首先我们需要明确一点: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()
以上是关于类的两种创建方式(通过元类创建类)的主要内容,如果未能解决你的问题,请参考以下文章