如何使用 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
中。
这里对 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
中。