Python面向对象:如何在__init__方法中打印类实例的变量名?
Python类的
__init__方法能否获取实例绑定的变量名 现有代码实现
你编写的human类支持初始化时传入性别、眼睛颜色、身高、出生年份4个属性,内置年龄计算、全量属性打印两个方法,核心代码如下:
from datetime import date class human(): def __init__(self, sex, eyecolor, height, yearborn): self.sex = sex self.eyecolor = eyecolor self.height = height self.yearborn = yearborn print(self.sex, self.eyecolor, self.height, self.yearborn) def age(self): currentdate = date.today() a = currentdate.year - self.yearborn return a def display(self): print(self.sex) print(self.eyecolor) print(self.height) print(self.yearborn)
实例化代码为:
import humanclass Tom = humanclass.human("Male","Green", 173, 1994)
当前运行输出仅为传入的4个属性值:
Male Green 173 1994
你期望在__init__的打印逻辑中,同步打印该实例绑定的变量名(即示例中的Tom),询问该需求是否可实现。
结论与实现方案
原生能力上无法直接实现
- Python中的变量本质是指向内存对象的引用标签,变量名和对象本身不存在永久绑定关系:同一个对象可以被多个变量同时指向,也可以不绑定任何变量直接存在。
- 从代码执行顺序看,
Tom = human(...)语句的执行流程是:先完成类的实例化、跑完整个__init__方法的全部逻辑,最后才把生成的对象赋值给左侧的Tom变量。当__init__内部代码运行时,左侧的赋值动作还未完成,根本无法反向拿到后续才会绑定的变量名。 - 举个直观反例:如果实例化时不绑定任何变量,直接写
humanclass.human("Male","Green", 173, 1994),此时压根不存在所谓的“实例变量名”,自然不存在通用的获取逻辑。
推荐的替代实现
如果需要给每个实例绑定可识别的名称标识,直接把名称作为初始化参数显式传入即可,完全无需尝试反向捕获赋值时的变量名:
from datetime import date class human(): def __init__(self, instance_name, sex, eyecolor, height, yearborn): self.instance_name = instance_name self.sex = sex self.eyecolor = eyecolor self.height = height self.yearborn = yearborn # 初始化时同步打印实例名与属性 print(f"实例名:{self.instance_name},属性:{self.sex} {self.eyecolor} {self.height} {self.yearborn}") def age(self): currentdate = date.today() a = currentdate.year - self.yearborn return a def display(self): print(self.instance_name) print(self.sex) print(self.eyecolor) print(self.height) print(self.yearborn)
实例化时传入对应名称即可获得预期输出:
Tom = human("Tom", "Male", "Green", 173, 1994) # 运行输出:实例名:Tom,属性:Male Green 173 1994
- 部分通过遍历栈帧、全局变量引用匹配对象对应变量名的野路子写法,本质是依赖CPython解释器的内部实现细节,不具备跨版本、跨解释器的兼容性,一旦对象被多变量引用、或在非全局作用域赋值就会匹配出错,维护成本极高,不推荐在正式代码中使用。
内容的提问来源于stack exchange,提问作者JoeDainton123
相关产品推荐
相关产品推荐

