繁体   English   中英

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

[英]Why is the class passed to a function being called inside a class function when using self in Python?

因此,我有此代码段。

class LogObserver(object): 
    def write_log(...):
        self.logger.log(self, level, message, *args, **kwargs)
...

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

但是,当我从self.logger.log()删除selfself.logger.log()所示:

self.logger.log(level, message, *args, **kwargs)

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

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

如果调用实例方法( 不是 staticmethod或classmethod),则该实例作为第一个参数隐式传递。 这就是为什么方法定义将self作为第一个参数的原因。 顺便说一句, self这个名字只是一个约定。 例如, foo.bar()将被转换为type(foo).bar(foo)

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

现在,在方法内部, self通常是第一个参数。 假设您已经定义

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的过去并没有因此而改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM