Python内置int/list类子类化疑问:直接赋值对象无自定义方法
问题解答
核心原因一句话就能说清:直接写的整数、列表字面量,是Python内置int/list类的实例,不是你子类化后的自定义类实例。
具体说明
- 当你子类化内置类型(比如写
class MyInt(int):或者直接覆盖名称class int(int):),你只是创建了一个继承自内置类型的新类,但Python的字面量语法(比如8、[1,2,3])是在编译阶段就确定类型的,只会生成内置int/list的对象,完全不会关联你的自定义子类。 - 而通过构造器调用(比如
int(8)、list([1,2,3]))是运行时行为,会使用当前代码里绑定的int/list类——也就是你自定义的那个子类,所以这些对象能调用你添加的toString()方法。
举个实际代码例子你就懂了:
# 子类化内置int并覆盖同名 class int(int): def toString(self): return f"自定义整数: {self}" # 用构造器创建:是自定义子类的实例 a = int(8) print(type(a)) # 输出 <class '__main__.int'> print(a.toString()) # 正常执行,输出「自定义整数: 8」 # 字面量赋值:是内置int的实例 d = 8 print(type(d)) # 输出 <class 'int'>(这里的int是Python原生内置类) # d.toString() 会直接报错:AttributeError: 'int' object has no attribute 'toString'
列表的情况完全一致:
class list(list): def toString(self): return f"自定义列表: {self}" b = [1,2,3] print(type(b)) # 输出 <class 'list'>(内置类) c = list([1,2,3]) print(type(c)) # 输出 <class '__main__.list'>(自定义子类) print(c.toString()) # 正常执行,输出「自定义列表: [1, 2, 3]」
本质逻辑
Python的字面量类型是编译时固定的,不受运行时变量名绑定的影响。哪怕你把自定义子类命名为int/list,覆盖了内置类的名称,字面量依然会指向原生的内置类型实例,自然没有你添加的自定义方法。
内容的提问来源于stack exchange,提问作者fassage
相关产品推荐
相关产品推荐

