You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:45:04