之前学过用type()函数查看一个变量的类型,但是如果我想用type()直接查看一个类的类型怎么办?请参阅以下程序:
class Role:
pass
r = Role()
# 查看变量r的类型
print(type(r)) # <class '__main__.Role'>
# 查看Role类本身的类型
print(type(Role)) # <class 'type'>
运行上面程序,可以看到如下输出结果:
<class '__main__.Role'>
<class 'type'>
从上面的输出可以看出,Role类本身的类型是type。这句话有点啰嗦,怎么理解Role类的类型是type呢?
从Python解释器的角度来看,当程序使用class来定义Role类时,也可以理解为定义一个特殊的对象(类型类的对象),并将该对象赋值给Role变量。因此,程序使用类定义的所有类都是类类型的实例。
事实上,Python完全允许使用type()函数(相当于类型类的构造函数)来创建类型对象,而由于类型类的实例是一个类,Python可以使用type()函数动态创建类。例如,下面的程序:
def fn(self):
print('fn函数')
# 使用type()定义Dog类
Dog = type('Dog', (object,), dict(walk=fn, age=6))
# 创建Dog对象
d = Dog()
# 分别查看d、Dog的类型
print(type(d))
print(type(Dog))
d.walk()
print(Dog.age)
上面的第 4 行使用 type() 定义了一个 Dog 类。使用 type() 定义类时可以指定三个参数:
参数一:创建的类名。
参数2:该类继承的父类集合。由于Python支持多重继承,所以这里用一个元组来指定它的多个父类。即使实际上只有一个父类,也需要元组语法(必须有一个额外的逗号)。
参数3:字典对象是该类绑定的类变量和方法。字典的键是类变量或方法名。如果字典的值是普通值,则代表类变量;如果字典的值是一个函数,它代表一个方法。
可以看出,第四行代码定义了一个Dog类,它继承了object类,还为这个类定义了一个walk()方法和一个age类变量。
运行上面程序,将看到如下输出结果:
<class '__main__.Dog'>
<class 'type'>
fn函数
6
从上面的输出可以看出,使用type()函数定义的类和直接使用class定义的类没有区别。事实上,当 Python 解释器执行使用 class 定义的类时,它仍然使用 type() 函数来创建类。因此,无论以何种方式定义类,程序最终都会创建一个类型的实例。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在python中读取所有文件08/28
- ♥ python3安装详细步骤08/27
- ♥ python print的多种用途10/08
- ♥ python需要数学基础吗09/21
- ♥ Python numpy 中的掩码选择子集10/09
- ♥ python如何删除文本中的换行符11/18
内容反馈