2016-05-01 7 views
-1
class User(object): 

    def __init__(self, id_code, name, surname): 
     self.id_code = id_code 
     self.name = name 
     self.surname = surname 

class Worker(User): 

    def __init__(self, username, password, worker_type): 
     super(User, self).__init__() 
     self.username = username 
     self.password = password 
     self.worker_type = worker_type 

スーパークラスの属性を持つコンストラクタをどのように呼び出すことができますか?スーパークラスからコンストラクタを呼び出す方法

例:superの最初の引数は、現在のクラスでなければなりません:

super(Worker, self).__init__() 

をするために

id_code = "test_code" 
name = "test_name" 
surname = "test_surname" 
username = "test_username" 
password = "test_pass" 
+4

スーパークラスではなく、あなた自身のクラス*に 'super()'という名前を付ける必要があります: 'super(Worker、self).__ init __()'。また、期待される引数を明示的に渡す必要があります。 –

答えて

1

まず、あなたはすでに指摘した@MartijnPietersそこに小さな論理的なミスをしていましたそれらをスーパークラスに渡し、サブクラスでこれらの引数を受け入れる必要があります。いずれかのハードコードによって:

class User(object): 

    def __init__(self, id_code, name, surname): 
     self.id_code = id_code 
     self.name = name 
     self.surname = surname 

class Worker(User): 

    def __init__(self, id_code, name, surname, username, password, worker_type): # changed 
     super(Worker, self).__init__(id_code, name, surname) # changed 
     self.username = username 
     self.password = password 
     self.worker_type = worker_type 

又は*args**kwargsを使用して(例えば:correct way to use super (argument passing))。しかし、どのクラスがどの引数を必要とし、どのような順序でなければならないか、どの引数がポジションのみかキーワードのみか、それらをすべてポジション・キーワード引数として許可したいのかを知る必要があるため、これは自明ではありません。また、引数(-names)も隠します。

私は引数をハードコーディングすることに固執し、それが*args, **kwargsに切り替えることを検討するために長期的には複雑になる場合に限ります。

関連する問題