首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Python中使用self时,类被传递给在类函数中调用的函数?

为什么在Python中使用self时,类被传递给在类函数中调用的函数?
EN

Stack Overflow用户
提问于 2016-07-04 14:20:46
回答 1查看 50关注 0票数 0

所以,我有这个代码片段。

代码语言:javascript
复制
class LogObserver(object): 
    def write_log(...):
        self.logger.log(self, level, message, *args, **kwargs)
...

查看调试器和错误消息,我注意到变量level包含LogObserver而不是整数。我在期待一个整数。

但是,当我从self中删除self.logger.log()时,如下所示:

代码语言:javascript
复制
self.logger.log(level, message, *args, **kwargs)

level包含一个整数而不是一个LogObserver对象。错误信息也会消失。

这种行为背后的解释是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 14:25:01

如果调用实例方法(不是静态方法或类方法),则实例将作为第一个参数隐式传递。这就是为什么方法定义将self作为第一个参数的原因;顺便说一句,名称self只是一个约定。例如,foo.bar()将被翻译为type(foo).bar(foo)

如果您显式地将实例作为参数传递,那么它将像任何其他参数一样传递--在实例已经隐式传递之后。例如,foo.bar(foo)将被翻译为type(foo).bar(foo, foo)

现在,在方法中,self通常是第一个参数。假设你已经定义了

代码语言:javascript
复制
class Foo(object):
  def bar(self, other=None):
    pass
foo = Foo()

调用foo.bar()被转换为type(foo).bar(self=foo, other=None)。同样,foo.bar(foo)被翻译成type(foo).bar(self=foo, other=foo)

因此,当您调用self.logger.log(self, level, message, *args, **kwargs)时,它实际上被转换为type(self).logger.log(self=self, level=self, message=level, args=(message,), kwargs={})。因此,level获得对象的一个实例,即self

注意,foo.bar()并不总是被解析为type(foo).bar(foo) --只有当bar只在类/类型上定义时才是这样。然而,self的传递不会因此而改变。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38186953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档