在Python中,__format__
和__bytes__
是两个特殊方法,它们允许对象自定义它们在特定情境下的字符串表示。以下是这两个方法的区别和作用:
__format__
- 作用:
__format__
方法用于定义对象在使用format()
函数或格式化字符串(如f-string)时的行为。 - 参数:接收一个格式说明符(format specifier)作为参数,该参数指定对象应该如何被格式化。
- 返回值:应返回一个字符串,该字符串是对象的格式化表示。
- 用法:当你调用
format()
函数或使用格式化字符串时,Python会调用对象的__format__
方法。
示例:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __format__(self, format_spec):
if format_spec == 'c':
return f"({self.x}, {self.y})"
elif format_spec == 'p':
return f"Point({self.x}, {self.y})"
else:
return str(self)
p = Point(1, 2)
print(format(p, 'c')) # 输出: (1, 2)
print(format(p, 'p')) # 输出: Point(1, 2)
__bytes__
- 作用:
__bytes__
方法用于定义对象在调用bytes()
函数时的行为。 - 返回值:应返回一个字节串(bytes),该字节串是对象的字节表示。
- 用法:当你调用
bytes()
函数时,Python会调用对象的__bytes__
方法。
示例:
class MyClass:
def __init__(self, data):
self.data = data
def __bytes__(self):
return self.data.encode('utf-8')
obj = MyClass("Hello")
print(bytes(obj)) # 输出: b'Hello'
总结
__format__
:定义对象在使用format()
或格式化字符串时的行为,返回格式化后的字符串。__bytes__
:定义对象在调用bytes()
函数时的行为,返回对象的字节表示。
两者的主要区别在于它们处理的目标不同:__format__
是为了字符串格式化,而__bytes__
是为了字节串转换。
format 和 __format__
使用format函数与直接调用对象的__format__方法的示例:
class MyNumber:
def __init__(self, number):
self.number = number
def __format__(self, format_spec):
if format_spec == 'binary':
return bin(self.number)
return str(self.number)
n = MyNumber(42)
# 使用format函数
print(format(n, 'binary')) # 输出: 0b101010
# 直接调用__format__方法
print(n.__format__('binary')) # 输出: 0b101010
__format__方法是为类定义的特殊方法,用于定义对象的格式化行为;而format是内置函数,用户可以调用它来格式化对象,它会在内部调用对象的__format__方法。