Python面向对象编程中如何获取对象值而非其内存地址
问题根源
梳理你遇到的问题的核心原因:
- 你定义的
valor()、dado()方法只有打印逻辑,没有显式写return语句,Python中所有未声明返回值的方法默认返回None,所以你将方法调用结果存入列表/字典时得到的是空值 - 直接
print(d1)输出内存地址,是因为你没有给自定义类实现__str__魔法方法,Python打印类实例时默认输出对象的内存地址标识
解决方案
如果要实现创建GeraDado实例后无需额外调用方法就能直接获取骰子数值,可以参考如下修改方案:
from random import randint class Dado: def __init__(self, valor): self.__valor = valor # 给valor方法添加返回值 def valor(self): return self.__valor # 定义__str__方法,打印Dado实例时直接输出数值 def __str__(self): return str(self.__valor) class GeraDado: def __init__(self): self.__dado = Dado(randint(1,6)) # 给dado方法添加返回值 def dado(self): return self.__dado.valor() # 定义__str__方法,打印GeraDado实例时直接输出骰子数值 def __str__(self): return str(self.__dado.valor()) # 可选:定义__int__方法,支持直接把GeraDado实例转成整数参与运算 def __int__(self): return self.__dado.valor() # 测试效果 d1 = GeraDado() print(d1) # 直接输出骰子数值,不会打印内存地址 # 可以直接把实例转成整数存入列表 num_list = [] num_list.append(int(d1)) print(num_list) # 也可以直接调用dado()方法拿到数值 num_list.append(d1.dado()) print(num_list)
额外优化建议
如果你的GeraDado类仅用来生成骰子实例,没有其他额外逻辑,其实可以简化两层类的结构,直接合并功能减少冗余代码,示例如下:
from random import randint class Dado: def __init__(self): self.valor = randint(1,6) def __str__(self): return str(self.valor) # 直接生成骰子实例,用.valor属性拿值,print直接输出数值 d1 = Dado() print(d1) print(d1.valor)
内容的提问来源于stack exchange,提问作者bona.coder
相关产品推荐
相关产品推荐

