[英]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()
删除self
, self.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.