如何使用 super() 从 Parent class 继承默认值

How to inherit default values from Parent class using super()

这里对 python 来说相当新,对于一般编程来说,我有以下示例,其中我试图以某种方式从父 class 继承默认值这两个对象都可以制作。 如何做到又好又干净? - 尝试使用 *args 和 **kwargs 进行试验,但出现了不同的错误。

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()

我认为这是不可能的。我看到的是这样的:

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()

您可以使用 *args 实现此目的,但我认为这不是一个很好的设计选择。

class Student(Person):

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

这是将前 3 个位置参数传递给父级 (Person)class,因此 Student 无需担心。

您需要对列表进行切片 ([:2]),因为如果您像这样创建 Student 的实例:

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

那么 'BME' 现在是一个位置参数,并且包含在 *args 中。鉴于:

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

它现在是关键字参数,因此不会出现在 *args 中。