代码之家  ›  专栏  ›  技术社区  ›  Ashwin Nanjappa

如何使用print()打印类的对象?

  •  408
  • Ashwin Nanjappa  · 技术社区  · 15 年前

    我在学巨蟒的绳索。当我试图打印一个类的对象时 Foobar 使用 print() 函数,我得到如下输出:

    <__main__.Foobar instance at 0x7ff2a18c>
    

    有什么方法可以设置 印刷行为 (或 字符串表示 的) 及其 物体 ?例如,当我打电话时 打印() 在类对象上,我希望以某种格式打印它的数据成员。如何在Python中实现这一点?

    如果你熟悉C++类,以上可以达到标准 ostream 通过添加 friend ostream& operator << (ostream&, const Foobar&) 类的方法。

    11 回复  |  直到 6 年前
        1
  •  476
  •   Stevoisiak    7 年前
    >>> class Test:
    ...     def __repr__(self):
    ...         return "Test()"
    ...     def __str__(self):
    ...         return "member of Test"
    ... 
    >>> t = Test()
    >>> t
    Test()
    >>> print(t)
    member of Test
    

    这个 __str__ 方法是在打印时发生的,并且 __repr__ 方法是使用 repr() 函数(或使用交互式提示查看它时)。如果这不是最 蟒蛇 方法,我道歉,因为我仍然在学习-但它起作用。

    如果没有 阿尔法 方法,python将打印 第二乐章 相反。如果你定义 _战略__ 但不是 第二乐章 ,python将使用上面看到的 _报告__ 但仍在使用 _战略__ 用于打印。

        2
  •  106
  •   Stevoisiak    7 年前

    As Chris Lutz mentioned ,这是由 __repr__ 方法。

    从文件中 repr() :

    对于许多类型,此函数尝试返回一个字符串,当传递给 eval() 否则,表示是一个用尖括号括起来的字符串,其中包含对象类型的名称以及其他信息,通常包括对象的名称和地址。类可以通过定义 __repr__() 方法。

    进行以下等级测试:

    class Test:
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def __repr__(self):
            return "<Test a:%s b:%s>" % (self.a, self.b)
    
        def __str__(self):
            return "From str method of Test: a is %s, b is %s" % (self.a, self.b)
    

    ..它在python shell中的作用如下:

    >>> t = Test(123, 456)
    >>> t
    <Test a:123 b:456>
    >>> print repr(t)
    <Test a:123 b:456>
    >>> print(t)
    From str method of Test: a is 123, b is 456
    >>> print(str(t))
    From str method of Test: a is 123, b is 456
    

    如果没有 __str__ 方法已定义, print(t) (或) print(str(t)) )将使用的结果 第二乐章 相反

    如果没有 第二乐章 方法被定义,然后使用默认值,这相当于..

    def __repr__(self):
        return "<%s instance at %s>" % (self.__class__.__name__, id(self))
    
        3
  •  30
  •   user394430    9 年前

    一种可以应用于任何没有特定格式的类的通用方法可以如下所示:

    class Element:
        def __init__(self, name, symbol, number):
            self.name = name
            self.symbol = symbol
            self.number = number
    
        def __str__(self):
            return str(self.__class__) + ": " + str(self.__dict__)
    

    然后,

    elem = Element('my_name', 'some_symbol', 3)
    print(elem)
    

    生产

    __main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}
    
        4
  •  12
  •   Community CDub    8 年前

    只需在@dbr的答案中加上我的两分钱,以下是如何从他引用的官方文档中实现这句话的示例:

    “[…]返回一个字符串,该字符串在传递给eval()时将生成具有相同值的对象,[…]”

    给定此类定义:

    class Test(object):
        def __init__(self, a, b):
            self._a = a
            self._b = b
    
        def __str__(self):
            return "An instance of class Test with state: a=%s b=%s" % (self._a, self._b)
    
        def __repr__(self):
            return 'Test("%s","%s")' % (self._a, self._b)
    

    现在,很容易序列化 Test 班级:

    x = Test('hello', 'world')
    print 'Human readable: ', str(x)
    print 'Object representation: ', repr(x)
    print
    
    y = eval(repr(x))
    print 'Human readable: ', str(y)
    print 'Object representation: ', repr(y)
    print
    

    所以,运行最后一段代码,我们将得到:

    Human readable:  An instance of class Test with state: a=hello b=world
    Object representation:  Test("hello","world")
    
    Human readable:  An instance of class Test with state: a=hello b=world
    Object representation:  Test("hello","world")
    

    但是,正如我在上一次评论中所说:更多信息只是 here 你说什么?

        5
  •  12
  •   Robᵩ    9 年前

    你需要使用 __repr__ . 这是一个标准功能 __init__ . 例如:

    class Foobar():
        """This will create Foobar type object."""
    
        def __init__(self):
            print "Foobar object is created."
    
        def __repr__(self):
            return "Type what do you want to see here."
    
    a = Foobar()
    
    print a
    
        6
  •  8
  •   Community CDub    8 年前

    对于Python 3:

    如果特定格式不重要(例如用于调试),只需从下面的可打印类继承。不需要为每个对象编写代码。

    受到启发 this 回答

    class Printable:
        def __repr__(self):
            from pprint import pformat
            return "<" + type(self).__name__ + "> " + pformat(vars(self), indent=4, width=1)
    
    # Example Usage
    class MyClass(Printable):
        pass
    
    my_obj = MyClass()
    my_obj.msg = "Hello"
    my_obj.number = "46"
    print(my_obj)
    
        7
  •  7
  •   Mike from PSG    7 年前

    @user394430提供的更漂亮的响应版本

    class Element:
        def __init__(self, name, symbol, number):
            self.name = name
            self.symbol = symbol
            self.number = number
    
        def __str__(self):
            return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))
    
    elem = Element('my_name', 'some_symbol', 3)
    print(elem)
    

    生成名称和值的外观良好的列表。

    <class '__main__.Element'>
    name = my_name
    symbol = some_symbol
    number = 3
    

    一个更高级的版本(谢谢鲁德)对这些项目进行了分类:

    def __str__(self):
        return  str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))
    
        8
  •  7
  •   John o elhajoui    6 年前

    如果你遇到这样的情况 @Keith 你可以试试:

    print a.__dict__
    

    它违背了我认为的好样式,但如果您只是尝试调试,那么它应该做您想要的。

        9
  •  1
  •   Stumpy    9 年前

    这个问题已经有很多答案了,但是没有一个特别帮助我,我必须自己解决,所以我希望这一个能提供更多的信息。

    你只需要确保你在课后有括号,例如:

    print(class())
    

    下面是我正在处理的一个项目的代码示例:

    class Element:
        def __init__(self, name, symbol, number):
            self.name = name
            self.symbol = symbol
            self.number = number
        def __str__(self):
            return "{}: {}\nAtomic Number: {}\n".format(self.name, self.symbol, self.number
    
    class Hydrogen(Element):
        def __init__(self):
            super().__init__(name = "Hydrogen", symbol = "H", number = "1")
    

    为了打印我的氢类,我使用了以下方法:

    print(Hydrogen())
    

    请注意,如果没有氢结尾的括号,这将不起作用。它们是必要的。

    希望这有帮助,如果你还有问题,请告诉我。

        10
  •  1
  •   Yash Tile    7 年前

    简单使用 “阿什斯特罗” 你班里的特殊方法。 为Ex.

    一级程序员:

    def __init__(self, name):
        self.company_name = name
    
    def __str__(self):
        return "I am the Founder of Adiprogrammer!"
    

    yash=adiProgrammer(“aaditya”)。

    打印(YASH)

        11
  •  -2
  •   coder Flo We    7 年前

    这些对我都没有真正的帮助。我不想为了打印而更改原始对象的定义。我不想使用继承,甚至把它们 STR 在我的班级里。这意味着我必须更改所有要调试的类。相反,我宁愿有一个班级,打印出整个班级的内容。有点像

    class Address( ):
      __init__( self )
         self.mName = 'Joe'
         self.mAddress = '123 Easy Street'
    
    a = Address()
    print a
    or
    print printClass( a )
    

    这将打印如下内容:

     Class Address contains:
       mName = 'Joe'
       mAddress = '123 Easy Street'
    

    在用法和一个不需要更改原始对象定义的想法上很好和简单。如果我必须创建一个解构对象的小函数,我会同意的。因为我可以简单地调用知道如何做的函数。我可以在不更改原始类定义的情况下直接使用它。