在python3类中格式化__str__的输出字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python3类中格式化__str__的输出字符串相关的知识,希望对你有一定的参考价值。

所以我刚刚完成了我的第一个Java学期,并试图将我们的一些项目转换为python代码。我们有一个PetRecord类需要有一个名字(str),年龄(双倍)和权重(double)。该项目需要为所有这些创建getter和setter,以及toString。

我找到了一个使用的示例__str__方法,它允许python对象的属性仅通过print(object_name)打印到屏幕上。我不确定为什么我的格式化不正常。如果有人可以启发我为什么扔它:

Traceback (most recent call last):
  File "PetRecord.py", line 92, in <module>
    print(TestPet)
  File "PetRecord.py", line 49, in __str__
    return('Name: {self.__name} 
Age: {self.__age} 
Weight:{self.__weight}').format(**self.__dict__) # this is printing literally 
KeyError: 'self'

代码本身(更改了此帖子的行格式):

class PetRecord(object):
  '''
  All pets come with names, age and weight
  '''
  def __init__(self, name='No Name', age=-1.0,
               weight=-1.0):
    # data fields
    self.__name = name
    self.__age = age
    self.__weight = weight

  def __str__(self):
    # toString()  
    return('Name: {self.__name} 
Age: {self.__age} 
          
Weight:{self.__weight}').format(
          **self.__dict__) # this is printing literally 

任何帮助都将非常感激。

答案

KeyError的原因是self没有传递给格式化字符串。

你有另外一个问题 - 单个你在实例属性名称前加上双下划线(使它们成为“私有”) - the actual names would be mangled - 这意味着,例如,你需要访问__name作为self._PetRecord__name

def __str__(self):
    return "Name: {self._PetRecord__name}
Age: {self._PetRecord__age}
Weight: {self._PetRecord__weight}".format(self=self)

请注意,在Python 3.6+中,您可以使用f-strings

def __str__(self):
    return f"Name: {self._PetRecord__name}
Age: {self._PetRecord__age}
Weight: {self._PetRecord__weight}"

以上是关于在python3类中格式化__str__的输出字符串的主要内容,如果未能解决你的问题,请参考以下文章

python3.x __str__与__repr__

CSIC_716_20191102

python3字符串方法

REMOTE EXECUTION

3.4字符串格式输出

python3 json数据格式的转换(dumps/loads的使用dict to str/str to dictjson字符串/字典的相互转换)