Python 将类分配给实例变量时自变量的工作方式

Python 将类分配给实例变量时自变量的工作方式,python,robotframework,Python,Robotframework,我在robot框架中遇到了以下代码。 变量被赋予不同的类名。 为了理解上述任务是如何工作的,我编写了以下代码,这是在使用self时抛出的错误 class Foo(object): def __init__(self): pass def addition(self): return 5 class boo(object): def __init__(self): self.word = Foo(self) def mul

我在robot框架中遇到了以下代码。 变量被赋予不同的类名。

为了理解上述任务是如何工作的,我编写了以下代码,这是在使用self时抛出的错误

class Foo(object):
    def __init__(self):
        pass

def addition(self):
    return 5

class boo(object):
    def __init__(self):
        self.word = Foo(self)  

    def multiply(self):
        return self.word.addition()

if __name__ == '__main__':
    b = boo()
    print(b.multiply())  #TypeError: __init__() takes 1 positional argument but 2 were given
在boo()类中使用以下组合时,获得正确的输出,即5

  • self.word=Foo;返回self.word.addition(self)
  • self.word=Foo();返回self.word.addition()

  • 问题是
    Foo
    类中的
    def\uuuu init\uuuu(self)
    。您可以将其作为参数
    self
    ,但是,与任何其他方法一样,它不需要专门传入。因此,在
    boo
    构造函数中,当你说
    self.word=Foo(self)
    时,你实际上是在用两个参数调用
    Foo的
    \uuuu init\uuu
    ;您通过的
    boo
    的固有
    self
    self
    。这就解释了为什么你会得到一个错误,
    \uuuu init\uuuu()接受1个位置参数,但给出了2个位置参数。首先,让我们看一下代码和您得到的错误:

    b = boo()
    print(b.multiply())  #TypeError: __init__() takes 1 positional argument but 2 were given
    
    您的评论似乎暗示您认为在调用
    b.multiply()
    时发生了错误。但是,当您查看堆栈跟踪时,您将看到它是在执行
    b=boo()
    时发生的:

    请记住,python将自动传入
    self
    ,因此传入的第一个参数将与
    变量
    参数关联

    考虑这一行代码:

    self.store = VariableStore(self)
    
    根据
    VariableStore
    的定义,它与以下内容完全相同:

    self.store = VariableStore(variables=self)
    

    请注意,
    self
    \uuuu init\uuu
    self
    参数不同。它被传递到
    变量
    参数。这是因为python在构造类时会自动将
    self
    作为第一个参数传递。

    乘法如何工作,因为它在类
    Foo
    中不存在(至少根据您的代码,可能是格式化?),而且,无法创建
    boo
    ,as
    Foo
    在init中不接受任何参数,它将抛出
    TypeError
    ,如注释中所示。这里的实际问题是什么?
    Foo
    不接受任何参数。您误读了错误。您没有共享您的回溯,但我打赌它不是指向
    print()
    行,而是指向
    b=boo()
    行,然后是
    self.word=Foo(self)
    。请查看
    VariableStore
    构造函数的。它接受绑定参数
    self
    和一个位置参数
    变量
    。调用它作为
    VariableStore(self)
    实际上相当于
    VariableStore(variables=self)
    @MartijnPieters,这里是回溯:回溯(最近一次调用):文件“C:/Users/dell/PycharmProjects/Meetup/project1.py”,第25行,在b=boo()文件“C:/Users/dell/PycharmProjects/Meetup/project1.py”第11行,在init self.word=Foo(self)#类中作为构造函数类型错误:uuu init_uuu()接受1个位置参数,但给出了2个
    class VariableStore(object):   
        def __init__(self, variables):
            ...
    
    self.store = VariableStore(self)
    
    self.store = VariableStore(variables=self)