How to print objects of class using print()?
我在学Python的绳索。当我尝试使用
1 | <__main__.Foobar instance at 0x7ff2a18c> |
有没有一种方法可以设置类及其对象的打印行为(或字符串表示)?例如,当我在类对象上调用
如果您熟悉C++类,可以通过为类添加EDCOX1×4的方法来实现标准EDOCX1 3。
1 2 3 4 5 6 7 8 9 10 11 | >>> class Test: ... def __repr__(self): ... return"Test()" ... def __str__(self): ... return"member of Test" ... >>> t = Test() >>> t Test() >>> print(t) member of Test |
如果没有给出
正如ChrisLutz所提到的,这是由类中的
根据
For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to
eval() , otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object. A class can control what this function returns for its instances by defining a__repr__() method.
进行以下等级测试:
1 2 3 4 5 6 7 8 9 10 | 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中的作用如下:
1 2 3 4 5 6 7 8 9 | >>> 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 |
如果没有定义
如果没有定义
1 2 | def __repr__(self): return"<%s instance at %s>" % (self.__class__.__name__, id(self)) |
一种可以应用于任何没有特定格式的类的通用方法可以如下所示:
1 2 3 4 5 6 7 8 | 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__) |
然后,
1 2 | elem = Element('my_name', 'some_symbol', 3) print(elem) |
生产
1 | __main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3} |
只需在@dbr的答案中加上我的两分钱,以下是如何从他引用的官方文档中实现这句话的示例:
"[...] to return a string that would yield an object with the same value when passed to eval(), [...]"
给定此类定义:
1 2 3 4 5 6 7 8 9 10 | 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) |
现在,很容易序列化
1 2 3 4 5 6 7 8 9 | x = Test('hello', 'world') print 'Human readable: ', str(x) print 'Object representation: ', repr(x) y = eval(repr(x)) print 'Human readable: ', str(y) print 'Object representation: ', repr(y) |
所以,运行最后一段代码,我们将得到:
1 2 3 4 5 | 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") |
但是,正如我在上次评论中所说:更多信息就在这里!
你需要使用
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
如果你遇到像@keith这样的情况,你可以尝试:
1 | print a.__dict__ |
它违背了我认为的好样式,但如果您只是尝试调试,那么它应该做您想要的。
对于Python 3:
如果特定格式不重要(例如用于调试),只需从下面的可打印类继承。不需要为每个对象编写代码。
灵感来源于这个答案
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) |
@user394430提供的更漂亮的响应版本
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Element: def __init__(self, name, symbol, number): self.name = name self.symbol = symbol self.number = number def __str__(self): return str(self.__class__) + ' '+ ' '.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__)) elem = Element('my_name', 'some_symbol', 3) print(elem) |
生成名称和值的外观良好的列表。
1 2 3 4 | <class '__main__.Element'> name = my_name symbol = some_symbol number = 3 |
一个更高级的版本(谢谢鲁德)对这些项目进行了分类:
1 2 3 4 | def __str__(self): return str(self.__class__) + ' ' + ' '.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__))) |
只需在类内使用"uu str_uuu"特殊方法。为Ex.
一级程序员:
1 2 3 4 5 | def __init__(self, name): self.company_name = name def __str__(self): return"I am the Founder of Adiprogrammer!" |
yash=adiProgrammer("aaditya")。
打印(YASH)
这个问题已经有很多答案了,但是没有一个特别帮助我,我必须自己解决,所以我希望这一个能提供更多的信息。
你只需要确保你在课后有括号,例如:
1 | print(class()) |
下面是我正在处理的一个项目的代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Element: def __init__(self, name, symbol, number): self.name = name self.symbol = symbol self.number = number def __str__(self): return"{}: {} Atomic Number: {} ".format(self.name, self.symbol, self.number class Hydrogen(Element): def __init__(self): super().__init__(name ="Hydrogen", symbol ="H", number ="1") |
为了打印我的氢类,我使用了以下方法:
1 | print(Hydrogen()) |
请注意,如果没有氢结尾的括号,这将不起作用。它们是必要的。
希望这有帮助,如果你还有问题,请告诉我。
这些对我都没有真正的帮助。我不想为了打印而更改原始对象的定义。我不想使用继承,甚至不想把这些str函数放到我的类中。这意味着我必须更改所有要调试的类。相反,我宁愿有一个班级,打印出整个班级的内容。有点像
1 2 3 4 5 6 7 8 9 | class Address( ): __init__( self ) self.mName = 'Joe' self.mAddress = '123 Easy Street' a = Address() print a or print printClass( a ) |
这将打印如下内容:
1 2 3 | Class Address contains: mName = 'Joe' mAddress = '123 Easy Street' |
在用法和一个不需要更改原始对象定义的想法上很好和简单。如果我必须创建一个解构对象的小函数,我会同意的。因为我可以简单地调用知道如何做的函数。我可以在不更改原始类定义的情况下直接使用它。