如果我有一个类...class MyClass: def method(arg): print(arg)...我用它创建一个对象...my_object = MyClass()...我在其上调用 method(\'foo\') 就像这样......
如果我有一堂课...
class MyClass:
def method(arg):
print(arg)
...我用它来创建一个对象...
my_object = MyClass()
... 我 method("foo")
这样称呼它...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
...为什么 Python 告诉我我给了它两个参数,而我只给了一个?
遇到此类错误时还需要考虑以下几点:
我遇到了这个错误消息,发现这篇文章很有帮助。结果发现,在我的情况下,我覆盖了 __init__()
存在对象继承的地方。
继承的示例相当长,因此我将跳到一个不使用继承的更简单的示例:
class MyBadInitClass:
def ___init__(self, name):
self.name = name
def name_foo(self, arg):
print(self)
print(arg)
print("My name is", self.name)
class MyNewClass:
def new_foo(self, arg):
print(self)
print(arg)
my_new_object = MyNewClass()
my_new_object.new_foo("NewFoo")
my_bad_init_object = MyBadInitClass(name="Test Name")
my_bad_init_object.name_foo("name foo")
结果是:
<__main__.MyNewClass object at 0x033C48D0>
NewFoo
Traceback (most recent call last):
File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in <module>
my_bad_init_object = MyBadInitClass(name="Test Name")
TypeError: object() takes no parameters
PyCharm 没有发现这个拼写错误。Notepad++ 也没有(其他编辑器/IDE 可能会发现)。
当然,这是一个“不接受参数”的类型错误,就 Python 中的对象初始化而言,它与预期一个参数时得到的“得到两个”并没有太大区别。
讨论主题:如果语法正确,将使用重载初始化程序,但如果语法不正确,它将被忽略,而改用内置函数。对象不会期望/处理这一点,并且会抛出错误。
如果出现语法错误:修复很简单,只需编辑自定义 init 语句:
def __init__(self, name):
self.name = name