>>> format(sys.stdout)
"<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>"
>>> str(sys.stdout)
"<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>"
Run Code Online (Sandbox Code Playgroud)
我不太确定以下来自 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() 方法,以生成对象的“格式化”字符串表示。
我将分解主要的三个(技术上主要的 2,因为__format__不是很常见)。我将完成所有三个,然后将它们放在一个不错的课程中。
最常见的__str__:
这就是您希望将此对象表示为str. 这通常不太详细,__repr__主要用于最终用户。例如,如果我们有一个person类,我们可以这样实现str:
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Hello my name is {self.name}"
p = Person("John Smith")
print(str(p)) # Prints "Hello my name is John Smith"
Run Code Online (Sandbox Code Playgroud)
不太常见的__repr__:
老实说,我str对大多数项目的实施比我实施的要多。这应该以一种str对开发人员而不是最终用户有帮助的方式返回对象的表示形式,并通过 调用repr(my_obj)。如果一个类没有实现__str__魔法方法__repr__,那么当你使用时,python 会尝试自动调用它的方法str(my_obj)(因此你可以repr先实现,然后str再实现)。通常repr一个类的 返回重新创建该对象的方式。例如:
class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"Person(name='{self.name}')"
p = Person("John Smith")
print(repr(p)) # Prints "Person(name='John Smith')"
print(str(p)) # Prints "Person(name='John Smith')"
Run Code Online (Sandbox Code Playgroud)
被诅咒的孩子__format__:[我只是这么称呼它,因为它太不常用了:)]
要理解这一点,我必须首先解释一些格式化的东西。您之前可能已经看过其中一些内容,也可能没有。
让我们使用一个虚拟类:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person(name="{self.name}", age={self.age})'
def __str__(self):
return str(self.name)
p = Person(name="John Smith", age=22)
# 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)
Run Code Online (Sandbox Code Playgroud)
好的,您可以将类格式化为 itsstr或 its repr,但是如果您想以自己的方式对其进行格式化怎么办?大多数人不需要这样做;但是,这就是python的力量,你可以做任何事情。我们可以创建不同的标签来代替rand s(虽然它使用:代替!):
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person(name="{self.name}", age={self.age})'
def __str__(self):
return str(self.name)
def __format__(self, format_spec):
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(name="John Smith", age=22)
# 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}")
Run Code Online (Sandbox Code Playgroud)
这显然比我有限的知识所能涉及的要多,但这应该是一个很好的一般范围:)。
有一些软件包使用它,例如datetime. 如果你有兴趣了解更多关于格式的力量,Pyformat可以很好地完成这个:PyFormat。
我没有太多使用经验,__format__所以我不能提供一个好的用例(尽管 datetime 的用例还不错)。这里的一切都只是为了显示之间的差异广阔str,repr和format魔术方法。如果我有任何错误(尤其是__format__的用例),请告诉我,我会更新它。
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |