2017-12-13 20 views
0

ここではPythonの初心者にはかなり新しく、プログラミングには一般的に次の例があります。この例ではParentクラスのデフォルト値を継承しようとしています両方のオブジェクトを作成できる方法。 きれいにしてきれいにするには? - * argsと** kwargsを試そうとしましたが、異なるエラーがありました。super()を使用して親クラスからデフォルト値を継承する方法

class Person(object): 

def __init__(self, name="Jane Doe", age="30", gender="female"): 
    self.name = name 
    self.age = age 
    self.gender = gender 
    self.goal = "My goal is: Live for the moment!" 


class Student(Person): 

def __init__(self, name, age, gender, prev_org="The School of Life", skip_d=0): 
    super(Student, self).__init__(name, age, gender,) 
    self.prev_org = prev_org 
    self.skip_d = skip_d 
    self.goal = "Be a junior software developer." 

john = Student('John Doe', 20, 'male', 'BME') 

student = Student() 
+0

これはおそらくクラスデコレータを使用して行うことができますが、やはり設計上の問題を示しています。 –

答えて

0

これは可能ではありません。私が代わりに見てきたことは、このようなものです:

class Person(object): 

    def __init__(self, name=None, age=None, gender=None): 
     if name is None: 
      name = "Jane Doe" 
     if age is None: 
      age = "30" 
     if gender is None: 
      gender = "female" 

     self.name = name 
     self.age = age 
     self.gender = gender 
     self.goal = "My goal is: Live for the moment!" 


class Student(Person): 

    def __init__(self, name=None, age=None, gender=None, prev_org="The School of Life", skip_d=0): 
     super(Student, self).__init__(name, age, gender) 
     self.prev_org = prev_org 
     self.skip_d = skip_d 
     self.goal = "Be a junior software developer." 


john = Student('John Doe', 20, 'male', 'BME') 

student = Student() 
0

あなたは*argsでこれを達成することができますが、私はそれは素晴らしいデザインの選択肢はないと思います。

class Student(Person): 

    def __init__(self, *args, prev_org="The School of Life", skip_d=0): 
     super(Student, self).__init__(*args[:2]) 

これにはStudentはそれを心配する必要はありませんクラス(Person)親に最初の3つの位置引数をオフに渡しています。

あなたがそうのようなStudentのインスタンスを作成した場合ので、あなたはリストを([:2])をスライスする必要があります。

john = Student('John Doe', 20, 'male', 'BME') 

を次に'BME'は現在位置引数で、*argsに含まれています。これに対し:

john = Student('John Doe', 20, 'male', prev_org='BME') 

今ではキーワード引数であるので、*argsには表示されません。

関連する問題