在这里是Python的新事物,并且作为一般编程,我有以下示例,在此示例中,我试图从父类中继承默认值可以制作对象。如何做好干净? - 试图尝试 *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()
您可以使用*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
中。
我认为这是不可能的。我看到的是这样的东西:
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()