สิ่งอื่นที่ควรพิจารณาเมื่อพบข้อผิดพลาดประเภทนี้:
ฉันพบข้อความแสดงข้อผิดพลาดนี้และพบว่าโพสต์นี้มีประโยชน์ ปรากฎในกรณีของฉันฉันได้แทนที่สิ่ง__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 อื่น ๆ )
ได้รับนี่คือ "ไม่ใช้พารามิเตอร์" TypeError มันไม่แตกต่างจาก "มีสอง" มากเมื่อคาดหวังหนึ่งในแง่ของการเริ่มต้นวัตถุใน Python
การกำหนดแอดเดรสของหัวข้อ: initializer การโอเวอร์โหลดจะถูกใช้หากถูกต้องทางไวยากรณ์ แต่ถ้าไม่ใช่จะถูกละเว้นและจะใช้บิวด์อินแทน วัตถุไม่คาดหวัง / จัดการกับสิ่งนี้และเกิดข้อผิดพลาดขึ้น
ในกรณีที่มีข้อผิดพลาดทางไวยากรณ์: การแก้ไขง่าย ๆ เพียงแก้ไขคำสั่ง init ที่กำหนดเอง:
def __init__(self, name):
self.name = name
self
เหตุผลที่เฉพาะเจาะจงที่นี่คือว่าวิธีการเช่นทั้งหมดคาดว่าจะหาเรื่องแรกซึ่งโดยการเรียกเรากำหนดเอง ดังนั้นประกาศที่ไม่ถูกต้องสำหรับวิธีการที่มันควรจะเป็นdef method(arg):
def method(self, arg):
เมื่อวิธีการจัดส่งพยายามที่จะเรียกmethod(arg):
และจับคู่สองพารามิเตอร์self, arg
กับมันคุณจะได้รับข้อผิดพลาดที่