类的两种创建方式(通过元类创建类)

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()

 

以上是关于类的两种创建方式(通过元类创建类)的主要内容,如果未能解决你的问题,请参考以下文章

创建类的两种方式

深入理解Python中的元类---metaclass

JAVASCRIPT创建类的两种常用方式

ExtJS 3:创建自定义类的两种方式:有啥区别?

Python从门到精通:元类-01-元类

2.自定义元类控制类的创建行为