>>> 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()方法,以产生一个 对象的“格式化”字符串表示形式。
答案 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的强大功能,您可以执行任何操作。我们可以创建不同的标签来代替str
和repr
(尽管它使用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
的用例),请告诉我,我将对其进行更新。