format()和str()有什么区别?

时间:2019-06-01 03:12:58

标签: python python-3.x io

>>> format(sys.stdout)
"<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>"
>>> str(sys.stdout)
"<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>"

我不太确定Python库参考中的以下引号。 format()str()之间或object.__format__(self, format_spec)object.__str__(self )之间有什么区别?我们什么时候使用哪个?

  

object.__str__(self )

     

由str(object)和内置函数format()和print()调用   计算“非正式”或可很好打印的字符串表示形式   一个东西。

     

object.__format__(self, format_spec)

     

由format()内置函数调用,并通过扩展进行评估   格式化的字符串文字和str.format()方法,以产生一个   对象的“格式化”字符串表示形式。

1 个答案:

答案 0 :(得分:1)

我要分解主要的三个(技术上主要是2,因为__format__并不是很常见的实现)。我将遍历这三个部分,然后将它们放在一起上一堂好课。


最常见的__str__

这就是您想要将此对象表示为str的方式。 通常,它不如__repr__那样详细,并用于 主要针对最终用户。例如,如果我们有一个person类,我们可以这样实现str

class Person:
    def __init__(self, name="John Smith"):
        self.name = name
    def __str__(self):
        # This will return Hello my name is John Smith by default
        return f"Hello my name is {self.name}" 

不太常见的__repr__

说实话,对于大多数项目,我执行的次数比实施str的次数还要多。这应该以{{1​​}}的形式返回对象的表示形式,这样对 developer 而不是最终用户有所帮助,并通过str进行调用。如果某个类未实现repr(my_obj)魔术方法,则当您使用__str__时python会尝试自动调用其__repr__方法(因此您可以先实现str(my_obj)和{{ 1}})。通常,类的repr返回重新创建该对象的方式,例如:

str

被诅咒的孩子repr:[我之所以这样称呼它是因为它很少使用:)]

要理解这一点,我首先必须解释一些格式化的东西。您可能以前看过其中一些东西,也可能没看过。

让我们使用一个虚拟类:

class Person:
    def __init__(self, name="John Smith"):
        self.name = name
    def __repr__(self):
        return f"Person(name=\"{self.name}\")" 
p = Person()
print(str(p)) # Prints "Person(name="John Smith")"

好的,您可以将类设置为__format__class Person: def __init__(self, name="John Smith", age=22): self.name = name self.age = age def __repr__(self): return f'Person(name="{self.name}", age={self.age})' def __str__(self): # This will return Hello my name is John Smith by default return str(self.name) p = Person() # This prints the str of p print("{!s}".format(p)) # John Smith # This prints the representation of p print("{!r}".format(p)) # Person(name="John Smith", age=22) 格式,但是如果要自己格式化,该怎么办?大多数人不需要这样做。但是,这就是python的强大功能,您可以执行任何操作。我们可以创建不同的标签来代替strrepr(尽管它使用r而不是s):

:

很显然,这不仅限于我的有限知识,但这应该是一个很好的一般范围:)。

有些使用此功能的软件包,例如!。如果您有兴趣进一步了解 Pyformat 格式的功能,则可以很好地完成此过程:PyFormat

免责声明:

我在使用class Person: def __init__(self, name="John Smith", age=22): self.name = name self.age = age def __repr__(self): return f'Person(name="{self.name}", age={self.age})' def __str__(self): # This will return Hello my name is John Smith by default return str(self.name) def __format__(self, format_spec): # Make sure to choose a word not currently used (i.e. don't pick s, r, etc.) if format_spec == 'age': # get a persons age return f"{self.name} is {self.age} years old" elif format_spec == 'birthday': return "Yesterday" return str(self) # A default case p = Person() # This prints the str of p print("{!s}".format(p)) # This with representation of p print("{!r}".format(p)) print("{:age}".format(p)) print("{:birthday}".format(p)) print(f"{p:age} and his birthday was {p:birthday}") 方面没有太多经验,因此我无法提供良好的用例(尽管datetime的用例还不错)。这里的所有内容只是为了说明datetime__format__str魔术方法之间的广泛差异。如果我有任何问题(特别是repr的用例),请告诉我,我将对其进行更新。