为何对象属性可调用.__str__()?与str()方法有何区别?
为什么可以直接调用属性的__str__()方法?与str()有何区别?
先看队友写的代码:
class Dog: def __init__(self, hunger, size, cute): self.__hunger = hunger self.__size = size self.__cute = cute def __str__(self): data_1 = self.__hunger.__str__() # Why is this allowed? data_2 = self.__size.__str__() data_3 = self.__cute.__str__() return f"The dog is {data_1} and {data_2} but is also {data_3}" a = Dog(20, 120, True) print(a)
常规写法是这样:
class Dog: def __init__(self, hunger, size, cute): self.__hunger = hunger self.__size = size self.__cute = cute def __str__(self): data_1 = str(self.__hunger) data_2 = str(self.__size) data_3 = str(self.__cute) return f"The dog is {data_1} and {data_2} but is also {data_3}" a = Dog(20, 120, True) print(a)
一、为什么允许直接调用__str__()?
Python里几乎所有对象都继承自object基类,而object类本身就实现了__str__()方法。不管是代码里的int(20、120)、bool(True),还是自定义类的实例,都自带这个方法,所以直接调用对象的__str__()是完全合法的语法,解释器不会报错。
二、两种写法的核心区别
容错性不同
str()是Python内置函数,逻辑是先尝试调用对象的__str__(),如果对象没自定义实现这个方法(或方法被意外删除),会自动降级调用__repr__()兜底,不会直接抛异常。而直接调用obj.__str__()的话,若对象类没重写__str__且方法被移除,会直接触发AttributeError。编码风格差异
Python社区不推荐直接调用双下划线开头的“魔术方法”,这类方法设计初衷是给解释器或内置函数(比如str()、print())调用的,而非开发者直接写业务代码使用。str()写法更简洁易读,符合Python的编码规范。极端场景的表现不同
比如某些自定义类只实现了__repr__没写__str__,此时str(obj)会返回__repr__的结果,直接obj.__str__()也会调用object基类的__str__(本质也是调用__repr__),结果一致;但如果遇到极少数未继承object的对象(Python 3中几乎不存在),直接调用__str__()会报错,而str()依然能处理。
内容的提问来源于stack exchange,提问作者Pabloflopygame
相关产品推荐
相关产品推荐

