【问题标题】:Set name of object in class设置类中对象的名称
【发布时间】:2017-09-05 15:18:43
【问题描述】:

我想将一个类的名称设置为该类中的一个变量,以便在打印类时我得到它们的名称,我尝试设置 __name__ 但它不起作用。

这是我的课

class SNMPData(object):
    def __init__(self, device='', speed_down=0, speed_up=0, bgp_peer_state='', bgp_summary='', error=''):
        self.device = device
        self.speed_down = speed_down
        self.speed_up = speed_up
        self.bgp_peer_state = bgp_peer_state
        self.bgp_summary = bgp_summary
        self.error = error
        self.__name__ = device

我创建了一个对象列表,然后尝试打印它们

>>> list = [SNMPData(device='dev_1',speed_down=1),SNMPData(device='dev_2',speed_down=2)]
>>> print(list)
[<SNMPData object at 0x7ff052a42ef0>, <SNMPData object at 0x7ff052a42b38>]
>>>

而不是 0x 处的 SNMPData 对象....是否可以打印

['SNMPData dev_1','SNMPData dev_2']

改为?

【问题讨论】:

  • 你在找__repr__
  • 如果描述“足够小”,建议重新说明如何创建对象,例如SNMPData(device='{device}'),但如果它的状态非常重,只需做一些通用的&lt;SNMPData device={device} ...&gt;

标签: python python-3.x


【解决方案1】:

您正在寻找定义__repr__,它应该返回对象的可打印表示。 __repr__official definition

repr(对象):

返回一个包含对象可打印表示的字符串。 对于许多类型,此函数会尝试返回一个字符串 当传递给 eval() 时会产生一个具有相同值的对象, 否则表示是用尖括号括起来的字符串 包含对象类型的名称以及 附加信息通常包括姓名和地址 目的。一个类可以控制这个函数为其返回什么 通过定义 repr() 方法来实例化。

底线是 __str__ 的输出应该被人类 ** 读取,而 **__repr__ 的输出应该被 Python 解释器读取。 所以当您将字符串提供给解释器,它应该重新创建对象。此外,如果对象没有 __str__ 方法,则使用 __repr__ 代替。

【讨论】:

    【解决方案2】:

    每个类都有一个__repr____str__ 函数,它们接受一个参数self,表示对象本身。 __repr__ 函数返回对象的真实字符串表示,__str__ 函数用于str(obj),用于打印。

    class SNMPData(object):
        def __init__(self, device='', speed_down=0, speed_up=0, bgp_peer_state='', bgp_summary='', error=''):
            ...
        def __repr__(self):
            return '{} {}'.format(self.__class__.__name__, self.device)
    

    如果您想观察这种打印行为,您可以对__str__(self) 执行相同的操作。

    【讨论】:

    • 注意你不需要硬编码SNMPData:你可以使用self.__class__.__name__
    【解决方案3】:

    您可以通过覆盖 __repr____str__ 方法来更改自定义对象的文本表示:

    ...
    def __repr__(self):
        return self.__class__.__name__ + ' ' + self.device
    

    【讨论】:

      【解决方案4】:

      定义__repr__(self)__str__(self)

      前者是“官方”的字符串表示。后者是将对象转换为 str 时返回的内容。

      【讨论】:

        【解决方案5】:

        概括其他一些答案,您可以这样做:

        def __str__(self):
            return '{self.__class__.__name__} {self.device}'.format(self=self)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多