我正在使用pygamePython 上的庫開發游戲。我基本上定義了一個Character類,Knight類和Enemy類將從該類繼承函式。由于兩個子類使用相同的初始化函式,我__init__()在父類下定義了該函式。但是,我不完全理解它是如何作業的,并且出現以下錯誤:
TypeError: __init__() takes 1 positional argument but 3 were given
這是我的代碼:
class Character():
def __init__(self, img, hitbox, vel, pos_x, pos_y):
self.img = img
self.hitbox = hitbox
self.vel = vel
self.pos_x = pos_x
self.pos_y = pos_y
def draw(self):
if self.right:
pygame.transform.flip(self.img, True, False)
win.blit(self.img, (self.pos_x, self.pos_y))
class Knight(Character):
def __init__(self):
Character.__init__(self)
def move(self):
if self.right:
if self.x self.vel < win_width:
self.x = self.vel
if self.left:
if self.x - self.vel > 0:
self.x -= self.vel
main_plr = Knight("img", (19, 20), 5, 30, 20)
uj5u.com熱心網友回復:
正如您所看到的錯誤所說,您的Knight建構式不接受這些引數;如果你打算使用那種繼承的方法擴展,類和子類方法需要有匹配的引數簽名。最好使用super()來參考超類而不是顯式命名它。
處理這個最簡單的方法是使用*argsand **kwargs,將子類方法不需要的引數簡潔地傳遞給超類方法,即
class Character():
def __init__(self, img, hitbox, vel, pos_x, pos_y):
self.img = img
self.hitbox = hitbox
self.vel = vel
self.pos_x = pos_x
self.pos_y = pos_y
class Knight(Character):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def move(self):
if self.right:
if self.x self.vel < win_width:
self.x = self.vel
if self.left:
if self.x - self.vel > 0:
self.x -= self.vel
uj5u.com熱心網友回復:
快速修復:只需__init__從Knight.
引發錯誤是因為您創建了一個Knight帶有 6 個引數 ( self, "img", (19, 20), 5, 30, 20)的物件,而該__init__方法只接受一個 ( self)。
因此,如果您的Knight物件與Character物件相比沒有任何附加屬性,則洗掉該__init__方法就可以了
。現在,例如,如果您希望您的騎士擁有武器,則必須執行以下操作:
class Knight(Character):
def __init__(self, img, hitbox, vel, pos_x, pos_y, weapon):
super().__init__(img, hitbox, vel, pos_x, pos_y)
self.weapon = weapon
k = Knight("img", (19, 20), 5, 30, 20, "sword")
[編輯]
另外,正如@Matiiss 所建議的,您可以使用*args來避免重復Character.__init__in 的所有引數Knight.__init__。除了簡潔之外,還有一個優點是,Knight如果向Character物件添加屬性,則不必進行修改
。
class Knight(Character):
def __init__(self, *args, weapon):
super().__init__(*args)
self.weapon = weapon
k = Knight("img", (19, 20), 5, 30, 20, weapon="sword")
但現在的缺點是你必須指定weaponwith
weapon="the-weapon",因為它現在是一個關鍵字引數(放在 之后*args)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/329790.html
上一篇:Nginx回傳426
