类也是对象
在 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())