Python 中类的特殊方法
当我们在Python中定义一个类并尝试使用print语句打印它的一个实例时,我们将得到一个字符串,其中包含类名和对象实例的引用,即对象的内存地址。实例或对象没有默认的字符串功能实现。显示此行为的代码片段如下:
class 小汽车类:
质量标准 = "国家质量标准"
def __init__(我, 颜色, 品牌):
我.颜色 = 颜色
我.品牌 = 品牌
def 打印_颜色(我):
print(f"小汽车的颜色是:{我.颜色}")
def 打印_品牌(我):
print(f"小汽车的品牌是:{我.品牌}")
@classmethod
def 打印_质量标准(我之类):
print(f"我之质量标准:{我之类.质量标准}")
print(f"我之类名字是:{我之类.__name__}")
@staticmethod
def 打印_你好():
print("哇哦,这是一个来自于静态方法的问候")
if __name__ == "__main__":
小汽车 = 小汽车类("白色", "国威")
print(小汽车)
输出如下:
<__main__.小汽车类 object at 0x000001F4D0B509B0>
为了从print
语句中获得有意义的东西,我们需要实现一个特殊的__str__
方法,该方法将返回一个包含实例信息的字符串,并且可以根据需要进行自定义。下面是一个代码片段,显示了带有__str__
方法的小汽车类
类:
class 小汽车类:
质量标准 = "国家质量标准"
def __init__(我, 颜色, 品牌):
我.颜色 = 颜色
我.品牌 = 品牌
def 打印_颜色(我):
print(f"小汽车的颜色是:{我.颜色}")
def 打印_品牌(我):
print(f"小汽车的品牌是:{我.品牌}")
def __str__(我):
return f"我是一个小汽车,依呀依呀哟。我的颜色是{我.颜色},我的品牌是{我.品牌},我执行的质量标准是{我.质量标准}。"
@classmethod
def 打印_质量标准(我之类):
print(f"我之质量标准:{我之类.质量标准}")
print(f"我之类名字是:{我之类.__name__}")
@staticmethod
def 打印_你好():
print("哇哦,这是一个来自于静态方法的问候")
if __name__ == "__main__":
小汽车 = 小汽车类("白色", "国威")
print(小汽车)
这次的输出结果是:
我是一个小汽车,依呀依呀哟。我的颜色是白色,我的品牌是国威,我执行的质量标准是国家质量标准。
通过正确的__str__
实现,我们可以使用print
语句,而无需实现to_string()
等特殊函数。这是Python控制字符串转换的方法。出于类似原因使用的另一种流行方法是__repr__
,Python解释器使用它来检查对象。__repr__
方法更多地用于调试目的。
这些方法(以及其他一些方法)被称为特殊方法或dunder,因为它们总是以双下划线开头和结尾。普通方法不应使用此约定。这些方法在一些文献中也被称为魔术方法,但这不是官方术语。有几十种特殊方法可用于类的实现。Python 3官方文档中提供了一个全面的特殊方法列表,可以前往查看。
<结束>