对象的类型
约 514 字大约 2 分钟
2026-08-14
知识补充
使用 type() 动态定义类
类本身也是对象,type() 是创建类的内置函数。可以动态地创建类:
# type(类名, (父类元组,), {属性字典})
# 定义方法
def bark(self):
print(f"{self.name} says: Woof!")
# 动态创建 Dog 类
Dog = type('Dog', (), {'name': 'Buddy', 'bark': bark})
# 创建实例
my_dog = Dog()
print(my_dog.name) # Buddy
my_dog.bark() # Buddy says: Woof!参数说明:
- 第一个参数:类名(字符串)
- 第二个参数:继承的父类元组
- 第三个参数:类属性和方法的字典
实际应用场景: 在 ORM 框架或需要根据配置动态生成类的场景中经常使用。
MRO
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
print(D.__mro__) # (D, B, C, A)
print(D.mro()) # (D, B, C, A) 和 __mro__一样
print(D.__bases__) # (B, C)
print(D.__base__) # B,取__bases__第一个类中的私有成员
# 以下规则适用于所有成员
class A:
_a = 1 # 约定私有成员,外部仍然可以访问,大部分情况用它
__a = 2 # 严格私有成员,外部无法直接访问__a
__a__ = 3 # 有特殊作用的成员,往往是系统内置的
@classmethod
def test(cls):
print(cls._a, cls.__a, cls.__a__) # 内部可以访问所有成员
A.test() # 1 2 3
print(A._a, A.__a, A.__a__) # __a访问不到,其他可以对象的类型
所有的对象都是通过类创建的,创建对象的类,称之为该对象的类型(也有所属类的说法)
可以使用type(对象)得到某个对象的类型
- 所有函数的类型是
function - 所有类的类型是
type - 创建类的类,称之为元类(metaclass)
见
demo1.py的打印结果
成员的查找顺序
类成员的查找顺序
- 查找自身的MRO链条
- 查找元类的MRO链条
其他实例的查找顺序
- 查找自身
- 查找类型的MRO链条
