You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何对象属性可调用.__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__()是完全合法的语法,解释器不会报错。

二、两种写法的核心区别

  1. 容错性不同
    str()是Python内置函数,逻辑是先尝试调用对象的__str__(),如果对象没自定义实现这个方法(或方法被意外删除),会自动降级调用__repr__()兜底,不会直接抛异常。而直接调用obj.__str__()的话,若对象类没重写__str__且方法被移除,会直接触发AttributeError。

  2. 编码风格差异
    Python社区不推荐直接调用双下划线开头的“魔术方法”,这类方法设计初衷是给解释器或内置函数(比如str()、print())调用的,而非开发者直接写业务代码使用。str()写法更简洁易读,符合Python的编码规范。

  3. 极端场景的表现不同
    比如某些自定义类只实现了__repr__没写__str__,此时str(obj)会返回__repr__的结果,直接obj.__str__()也会调用object基类的__str__(本质也是调用__repr__),结果一致;但如果遇到极少数未继承object的对象(Python 3中几乎不存在),直接调用__str__()会报错,而str()依然能处理。

内容的提问来源于stack exchange,提问作者Pabloflopygame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:27:26