鱼C论坛

 找回密码
 立即注册
查看: 198|回复: 5

[技术交流] python 类的问题

[复制链接]
发表于 2024-10-14 21:01:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
现有如下类:
class A():
    def __str__(self):
        return '天空很蓝'

   
a =A()
a
<__main__.A object at 0x000001B89B904DA0>
print(a)
天空很蓝

试问上述代码,在执行"a = A()"实例化后, 执行a为何输出<__main__.A object at 0x000001B89B904DA0>, 而不是输出return的内容 ?为何要使用print才会输出返回值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-14 21:01:17 | 显示全部楼层
在Python中,当你直接在交互式环境(如Python解释器或者Jupyter Notebook)中输入一个对象的名字时,默认会调用这个对象的`__repr__`方法,而不是`__str__`方法。如果你的类没有定义`__repr__`方法,Python会使用一个默认的实现。

在你的这个例子中:

- `a` 的输出显示的是对象的默认表示,因为你只定义了 `__str__` 方法,没有定义 `__repr__` 方法。

- `__str__` 方法是在使用 `print(a)` 时被调用的,所以它能够返回你定义的字符串 "天空很蓝"。

如果想让直接输入 `a` 也返回 "天空很蓝",可以同时定义 `__repr__` 方法:
class A():
    def __str__(self):
        return '天空很蓝'
    
    __repr__ = __str__

a = A()
print(a)  # 天空很蓝
a         # 现在也会返回 '天空很蓝'

这样,无论是 `print(a)` 还是直接输入 `a`,都将调用相同的字符串表示。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-14 21:10:42 | 显示全部楼层
FishC 发表于 2024-10-14 21:01
在Python中,当你直接在交互式环境(如Python解释器或者Jupyter Notebook)中输入一个对象的名字时,默认会 ...

__repr__  是指那种魔法方法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-14 21:14:39 | 显示全部楼层
鬼少 发表于 2024-10-14 21:10
__repr__  是指那种魔法方法?


`__repr__` 是一种特殊的魔法方法(也称为"dunder"方法),它用于定义对象的官方字符串表示。这种表示通常是可以理解并且尽可能能够用于重新创建对象(例如通过 `eval()`)。它主要用于调试和开发阶段。

在交互式解释器中,输入对象名显示的就是 `__repr__` 返回的结果。如果你的类没有定义 `__repr__` 方法,Python会使用默认的实现,通常返回像 `<__main__.A object at 0x000001>` 这样的字符串。

以下是一个 `__repr__` 方法的简单例子:
class A:
    def __repr__(self):
        return 'A()'

a = A()
a  # 在交互式解释器中输出 'A()'

在大多数情况下,建议尽可能为类实现 `__repr__` 方法,以便获得更清晰的调试信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-14 21:24:33 | 显示全部楼层
FishC 发表于 2024-10-14 21:01
在Python中,当你直接在交互式环境(如Python解释器或者Jupyter Notebook)中输入一个对象的名字时,默认会 ...

在使用 `print(a)` 时为何会调用 `__str__` 方法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-14 21:25:14 | 显示全部楼层
鬼少 发表于 2024-10-14 21:24
在使用 `print(a)` 时为何会调用 `__str__` 方法?


在Python中,`print(a)` 会调用对象 `a` 的 `__str__` 方法,因为 `print()` 函数需要一个字符串来输出,而 `__str__` 方法就是用来返回一个对象的可读字符串表示的。

当你调用 `print(a)` 时,Python会执行以下步骤:

1. 检查对象 `a` 是否有 `__str__` 方法。
2. 如果有,调用 `__str__` 方法并返回其结果。
3. 如果没有 `__str__` 方法,Python会尝试调用 `__repr__` 方法。

`__str__` 方法的设计目的是提供一个对用户友好的字符串表示,而 `__repr__` 方法则是为开发者提供一个更详细的表示,通常是为了调试目的。

在你的代码中,`print(a)` 调用了 `__str__` 方法,因此输出了 "天空很蓝"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-24 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表