【问题标题】:Getting the value of an object instead of its location in memory获取对象的值而不是其在内存中的位置
【发布时间】:2021-12-11 23:28:40
【问题描述】:

我正在学习 Python 中的 OOP,并且正在制作一个包含 5 个骰子的游戏。我创建了Dado 对象来表示我的骰子,并创建了GeraDado 对象来实际创建Dado 对象。如果我创建一个对象,例如d1 = GeraDado(),我可以使用d1.valor() 方法打印它的值,但是如果我尝试将它的值附加到列表或字典中,它会返回None。如果我执行print(d1),它会返回对象在内存中的位置,而不是值。我怎样才能让它返回 d1 = GeraDado() 值而不是使用 d1.valor() 方法,它只是在屏幕上打印值?

from random import randint

class Dado:
    def __init__(self, valor):
        self.__valor = valor

    def valor(self):
        print(self.__valor)
        
class GeraDado:
    def __init__(self):
        self.__dado = Dado(randint(1,6))

    def dado(self):
        self.__dado.valor()

d1 = GeraDado()
print(d1)

【问题讨论】:

  • 列表中的append 方法返回None,只要您在列表末尾看到它,它就可以正常运行。您想覆盖 __str__ 方法以返回您认为类的“正确”字符串表示形式。通过默认 python 输出内存中的位置以及其他一些元数据

标签: python class oop methods


【解决方案1】:

您的Dado.valorGeraDado.dado 方法只打印骰子的值,它们实际上并不返回它,而是使用return 语句让它们返回值:

Dado.valor:

def valor(self):
    return self.__valor

GeraDado.dado:

def dado(self):
    return self.__dado.valor()

【讨论】:

    【解决方案2】:

    两个小建议:

    class Dado:
        # ...
        def valor(self):
            return self.__valor  
            # 1. return stuff!
            # Don't fall in love with print. It's just a debugging side-effect
          
    
    class GeraDado:
        # ... 
        def dado(self):
            return self.__dado.valor()  # 1. again: return!
    
        # 2. implement a __str__ method. 
        # This is your class's representation that is used by print
        def __str__(self):  
            return str(self.dado())
    
    >>> d1 = GeraDado()
    >>> print(d1)
    1
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多