Python 将类分配给实例变量时自变量的工作方式
我在robot框架中遇到了以下代码。 变量被赋予不同的类名。 为了理解上述任务是如何工作的,我编写了以下代码,这是在使用self时抛出的错误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
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
问题是
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
,asFoo
在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)