所以,我有这个代码片段。
class LogObserver(object):
def write_log(...):
self.logger.log(self, level, message, *args, **kwargs)
...查看调试器和错误消息,我注意到变量level包含LogObserver而不是整数。我在期待一个整数。
但是,当我从self中删除self.logger.log()时,如下所示:
self.logger.log(level, message, *args, **kwargs)level包含一个整数而不是一个LogObserver对象。错误信息也会消失。
这种行为背后的解释是什么?
发布于 2016-07-04 14:25:01
如果调用实例方法(不是静态方法或类方法),则实例将作为第一个参数隐式传递。这就是为什么方法定义将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的传递不会因此而改变。
https://stackoverflow.com/questions/38186953
复制相似问题