2015-06-04 18 views
10

Thứ nhất, đây là mã của tôi:LoạiError: Siêu không lấy đối số từ khóa?

class Enemy(): 
    def __init__(self, name, hp, damage): 
     self.name = name 
     self.hp = hp 
     self.damage = damage 


    def is_alive(self): 
     """Checks if alive""" 
     return self.hp > 0 

class WildBoar(Enemy): 
    def __init__(self): 
     super(WildBoar, name="Wild Boar", hp=10, damage=2).__init__() 

class Marauder(Enemy): 
    def __init__(self): 
     super(Marauder, name="Marauder", hp=20, damage=5).__init__() 


class Kidnappers(Enemy): 
    def __init__(self): 
     super(Kidnappers, name="The Kidnappers", hp=30, damage=7).__init__() 

Khi tôi biên dịch này, tôi nhận được lỗi này:

super(WildBoar, name="Wild Boar", hp=10, damage=2).__init__() 
TypeError: super does not take keyword arguments 

Tôi cố gắng nhìn xung quanh cho bất kỳ loại sự giúp đỡ nhưng tôi không thể tìm thấy bất cứ điều gì. Tôi cũng có một số Kwargs trong một số người siêu hạng của lớp khác, nhưng đây là những người gây bất kỳ vấn đề nào (kể từ bây giờ). Vậy điều gì có thể gây ra điều này? Tôi cũng đã nhìn thấy ai đó nói rằng đặt một super trong lớp cơ sở sẽ sửa chữa nó, nhưng nó không hoạt động (tôi đã vượt qua trong cùng một đối số trong lớp cơ sở của __init__).

Trả lời

12

Những lập luận cho phương pháp của cha mẹ __init__ phải được chuyển vào các __init__ phương pháp:

super(Kidnappers, self).__init__(name="The Kidnappers", hp=30, damage=7) 
# or 
super(Kidnappers, self).__init__("The Kidnappers", 30, 7) 

Tất cả các bạn vượt qua để super() là lớp con (Kidnappers trong trường hợp này) và một tham chiếu đến các trường hợp hiện tại (self).


Lưu ý tuy nhiên nếu bạn đang sử dụng Python 3.x, tất cả các bạn cần làm là:

super().__init__("The Kidnappers", 30, 7) 

và Python sẽ làm việc ra phần còn lại.


Dưới đây là một số liên kết đến nơi này được giải thích trong tài liệu:

+0

OK, tôi sẽ đi qua tất cả các mã của tôi và sửa tất cả, cảm ơn! – Scoutdrago3

-2

Lựa chọn # 1: Python 2.7x

Ở đây bạn ca n vượt qua self keywork thành super() vốn đề cập đến các thuộc tính cá thể.

super(self, name="Wild Boar", hp=10, damage=2).__init__() 

Lựa chọn # 2: Python 3x

super() không còn cần đến bất kỳ thông số và bạn chỉ có thể viết

super().__init__("The Kidnappers", 30, 7) 
+0

Tùy chọn # 1 vẫn đang chuyển các đối số '__init__' thành' super', sẽ thất bại giống như cách mà Scoutdrago3 đã trải qua. –

Các vấn đề liên quan