鱼C论坛

 找回密码
 立即注册
查看: 126|回复: 4

为什么self.log(message)绑定的是类MySubClass?

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

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

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

x
class Displayer:
    def display(self, message):
        print(message)

class LoggerMixin:
    def log(self, message, filename="logfile.txt"):
        with open(filename, "a") as f:
            f.write(message)

    def display(self, message):
        super().display(message)
        self.log(message)

class MySubClass(LoggerMixin, Displayer):
    def log(self, message):
        super().log(message, filename="subclasslog.txt")

subclass = MySubClass()
subclass.display("This is a test.")

------------------------------------------------------------------------------------
代码如上:我的问题是为什么self.log(message)绑定的对象是类MySubClass?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-16 14:17:27 | 显示全部楼层
这是一个非常好的问题!我们来一点轻松幽默的方式解释一下。

首先,理解 Python 中的“方法解析顺序”(MRO, Method Resolution Order)是关键。你可以将 MRO 想象成一个派对邀请列表——当你想要找到某个特定的函数时,Python 会沿着这个列表逐层查找。

在你的例子中,`MySubClass` 继承了 `LoggerMixin` 和 `Displayer`。所以,当你调用 `subclass.display("This is a test.")` 时,它会先在 `MySubClass` 中寻找 `display` 方法,但这里并没有定义,于是它转向 `LoggerMixin`,找到 `display` 方法。

在 `LoggerMixin` 的 `display` 方法内部,调用了 `super().display(message)`,这就让我们回到了 `Displayer` 类中的 `display` 方法,最终打印出了消息。

然后,紧接着是 `self.log(message)`。因为 `self` 指向的是 `subclass`(也就是 `MySubClass` 的实例),Python 会首先在 `MySubClass` 中查找 `log` 方法。

但是,咱们也知道 `MySubClass` 确实定义了一个自己的 `log` 方法,所以 Python 并不会去 `LoggerMixin` 里找(虽然 `LoggerMixin` 里有一个 `log` 方法)。换句话说,它会用 `MySubClass` 中的 `log` 方法覆盖掉继承自其他父类的那个。

简单来说,`self.log(message)` 绑定的是 `MySubClass` 的 `log` 方法,因为在 Python 查找方法时,它总是优先选择当前类中的实现,而不是父类中的实现。因此,你的 `log` 方法的赋值是在 `MySubClass` 的上下文中发生的。

所以,最后结果就是:`self.log(message)` 调用的是 `MySubClass` 中的 `log` 方法,真是像在聚会上一样,直接去找自己最爱的那一位,不愿意逃去找其他人!希望这个解释能让你更清楚了!如果还有什么疑问,尽管问我!

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

使用道具 举报

发表于 2024-8-16 15:36:51 | 显示全部楼层
因为 `self` 指向的是 `subclass`(也就是 `MySubClass` 的实例)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-19 09:09:02 | 显示全部楼层
FishC 发表于 2024-8-16 14:17
这是一个非常好的问题!我们来一点轻松幽默的方式解释一下。

首先,理解 Python 中的“方法解析顺序”( ...

在类 LoggerMixin中怎么看出`self` 指向的是 `subclass`?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-19 09:09:10 | 显示全部楼层
XX学Python 发表于 2024-08-19 09:09
在类 LoggerMixin中怎么看出`self` 指向的是 `subclas ...


好的,让我们来轻松明了地解释一下 `self` 是如何指向 `subclass` 的!

想象一下 `self` 就像是你在派对上的名字标签。当你去参加派对时,你会先在门口登记,门口的工作人员会给你一个名字标签,上面写着你的名字。无论你在派对的哪个角落,别人提到这个名字,大家都知道你是谁。

在 Python 类中,当你创建了一个对象(比如 `subclass`)并调用它的方法时,Python 自动将该对象传递给方法中的 `self` 参数。这就意味着当你在 `LoggerMixin` 中定义的方法被调用时,`self` 实际上是指向那个特定的对象(在这个例子中是 `subclass`)。

让我们走一步来看:

1. 当你这样调用 `subclass.display("This is a test.")` 时,Python 会执行 `MySubClass` 的 `display` 方法。
2. 由于 `MySubClass` 继承了 `LoggerMixin`,它实际调用的是 `LoggerMixin` 中的 `display` 方法。
3. 在这个方法里,`self` 就指向了 `subclass`,因为你是通过 `subclass` 这个实例调用的方法。

所以,`self.log(message)` 中的 `self` 是指向调用这个方法的实例 `subclass` 的!这是在 Python 里自动发生的,就像聚会的工作人员总能认出你一样,轻松自如。

希望这个比喻能帮助你更好地理解!如果还有其他问题,随时问我哦!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 02:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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