【问题标题】:How to inherit default values from Parent class using super()如何使用 super() 从父类继承默认值
【发布时间】:2018-05-27 21:59:57
【问题描述】:

这里对 python 和一般编程来说是相当新的,我有以下示例,在该示例中,我试图从 Parent 类继承默认值,从而可以创建两个对象。 怎么做又好又干净? - 尝试使用 *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()

【问题讨论】:

  • 使用类装饰器可能可以做到这一点,但话又说回来,这表明存在设计问题。

标签: python inheritance default init super


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用*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) 类,因此 Student 无需担心。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多