说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
__format__()
是 Python 中的一个特殊方法(也称为魔术方法或者魔法方法),用于定义对象的格式化字符串形式。它允许自定义对象在使用格式化字符串时的行为。通常情况下,__format__()
方法与内置的 format() 函数相配合使用。
当你使用字符串的 format() 方法来格式化一个对象时,Python 解释器会尝试调用该对象的 format() 方法来处理格式化操作。该方法应该返回一个格式化后的字符串表示形式。
__format__()
方法的定义如下(类的一个方法):
def __format__(self, format_spec):
# 根据 format_spec 格式化对象,并返回格式化后的字符串
pass
其中,format_spec 参数是格式化字符串中的格式说明符(format specifier)。它是一个字符串,用于指定对象的格式化方式,例如对齐方式、数字格式、日期格式等。具体的格式说明符取决于对象的类型和用途。
通过 format() 内置函数、扩展、格式化字符串字面值 的求值以及 str.format() 方法调用以生成一个对象的“格式化”字符串表示。 format_spec 参数为包含所需格式选项描述的字符串。 format_spec 参数的解读是由实现 __format__()
的类型决定的,不过大多数类或是将格式化委托给某个内置类型,或是使用相似的格式化选项语法。
请参看 格式规格迷你语言 了解标准格式化语法的描述。
返回值必须为一个字符串对象。
在 3.4 版本发生变更: object
本身的 __format__()
方法如果被传入任何非空字符,将会引发一个 TypeError。
在 3.7 版本发生变更: object.__format__(x, '')
现在等同于 str(x)
而不再是 format(str(x), '')
。
以下是一个简单的示例:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __format__(self, format_spec):
if format_spec == 'r':
return f"({self.x}, {self.y})"
else:
return f"<Point x={self.x}, y={self.y}>"
# 创建一个 Point 对象
p = Point(3, 4)
# 使用 format() 函数格式化对象
formatted = format(p, 'r') # 使用 'r' 格式说明符
print(formatted) # 输出:(3, 4)
formatted = format(p, '') # 默认格式说明符
print(formatted) # 输出:<Point x=3, y=4>
print(f'It is {p:r}') # 输出:It is (3, 4)
在这个示例中,我们定义了一个 Point 类,并实现了 __format__()
方法。根据传入的格式说明符,该方法返回不同的字符串表示形式。当使用字符串的 format() 函数来格式化 Point 对象时,Python 解释器会根据传入的格式说明符调用 __format__()
方法,并返回格式化后的字符串。
总的来说,__format__()
方法用于定义对象的格式化字符串形式,通常用于自定义对象的字符串输出格式。
假设我们有一个名为 Distance 的类,用于表示距离。我们希望可以将这个距离对象格式化为各种不同的单位,比如米、千米和英里。我们可以通过实现 __format__
方法来实现这个功能。
class Distance:
def __init__(self, meters):
self.meters = meters
def __format__(self, format_spec):
if format_spec == 'm':
return f"{self.meters} meters"
elif format_spec == 'km':
kilometers = self.meters / 1000
return f"{kilometers} kilometers"
elif format_spec == 'mi':
miles = self.meters * 0.000621371
return f"{miles} miles"
else:
return f"{self.meters} meters"
# 创建一个 Distance 对象
distance = Distance(5000)
# 使用 format() 函数格式化对象
print(format(distance, 'm'))
# 输出:5000 meters
print(format(distance, 'km'))
# 输出:5.0 kilometers
print(format(distance, 'mi'))
# 输出:3.1068559611866696 miles
# 使用 f-strings 格式化对象
print(f"The distance is: {distance:mi}")
# 输出:The distance is: 3.106855 miles
我们定义了一个 Distance 类来表示距离,它接受一个以米为单位的距离。我们实现了 __format__()
方法来根据传入的格式说明符对距离进行格式化。根据不同的格式说明符,我们可以将距离格式化为不同的单位,比如米、千米和英里。
https://docs.python.org/zh-cn/3/reference/datamodel.html#object.__format__
更新时间:March 3, 2024, 8:07 p.m. 标签:python 特殊方法 字符串 格式化