【测试开发】python碎片化知识点:动态创建类

2023-09-11 17:45:17 浏览数 (1)

类也是对象

在 Python 中,一切皆对象。字符串,列表,字典,函数是对象,类也是一个对象,因此你可以:

  • 把类赋值给一个变量
  • 把类作为函数参数进行传递
  • 把类作为函数的返回值
  • 在运行时动态地创建类

如何动态创建类呢,接下来来看下。

熟悉又陌生的 type

在日常使用中,我们经常使用 object 来派生一个类,事实上,在这种情况下,Python 解释器会调用 type 来创建类。

代码语言:javascript复制
>>> type(11)
<class 'int'>
>>> type(True)
<class 'bool'>

type 除了可以返回对象的类型,它还可以被用来动态地创建类(对象)

使用 type 来创建类(对象)的方式如下:

type(类名, 父类的元组(针对继承的情况,可以为空),包含属性和方法的字典(名称和值)) 最简单的情况

假设有下面的类:

代码语言:javascript复制
class Foo(object):
    pass

现在,我们不使用 class 关键字来定义,而使用 type,如下:

代码语言:javascript复制
Foo = type('Foo', (object, ), {})

使用 type 创建了一个类对象

上面两种方式是等价的。我们看到,type 接收三个参数:

  • 第 1 个参数是字符串 ‘Foo’,表示类名
  • 第 2 个参数是元组 (object, ),表示所有的父类
  • 第 3 个参数是字典,这里是一个空字典,表示没有定义属性和方法

在上面,我们使用 type() 创建了一个名为 Foo 的类,然后把它赋给了变量 Foo,我们当然可以把它赋给其他变量,但是,此刻没必要给自己找麻烦。

代码语言:javascript复制
>>> Foo = type('Foo', (object, ), {})
>>> print(Foo)
<class '__main__.Foo'>
>>> print(Foo())
<__main__.Foo object at 0x7f8cfef87fd0>

有属性和方法的情况

动态创建一个类

代码语言:javascript复制
def age(self):
    print('age')
    print(self.foo)
foo = type('Foo', (object, ), {'foo': True, 'greet': age})
fo=foo()
print(fo.greet())

0 人点赞