【问题标题】:Python - Multiple InheritancePython - 多重继承
【发布时间】:2021-08-05 16:58:34
【问题描述】:

我对编程很陌生,正在寻找一些帮助来改进一段代码。我的教程工作取得了理想的结果,但做得并不好。

class Person:
    def __init__(self, first_name, last_name, date_of_birth):
        self.first_name = first_name
        self.last_name = last_name
        self.date_of_birth = date_of_birth

    def get_details(self):
        return(f"Name: {self.first_name} {self.last_name}\nDate of Birth: {self.date_of_birth}")



class Worker:
    def__init__(self, tax_file_number, super_number):
        self.tax_file_number = tax_file_number
        self.super_number = super_number

    def get_info(self):
        return(f"TFN: {self.tax_file_number}\nSuper: {self.super_number}")


class Employee(Person, Worker):
    def __init__(self, first_name, last_name, date_of_birth, tax_file_number, super_number, employee_id, position):
        Person.__init__(self, first_name, last_name, date_of_birth)
        Worker.__init__(self, tax_file_number, super_number)
        self.employee_id = employee_id
        self.position = position

    def get_info(self):
        return(f"Employee ID: {self.employee_id}\nPosition: {self.position}")
        
    def get_details(self):
        person = (Person.get_details(self)) + "\n" + (Employee.get_info(self)) + "\n" + (Worker.get_info(self))
        return person


p = Person("Kim", "White", "12/08/2020")
print(p.get_details())
print()
w = Worker(4556655, 567)
print(w.get_info())
print()
e = Employee('Kim', 'White', '12/08/2020', 4556655, 567, 1121, 'Developer')
print(e.get_details())

对我来说问题是具有多重继承的员工类,
我真的需要像这样初始化所有属性吗?我认为使用继承会从其他类中获取它,
但这就是我设法让它工作的方法。

我试图让它更像,

class Employee(Person, Worker):
    def init(self, employee_id, position):
        self.employee_id = employee_id
        self.position = position
        #*Line of code to make it so the rest of the attributes come in here #

【问题讨论】:

  • 您当前的代码阅读起来很痛苦,能否请您正确格式化?

标签: python oop inheritance multiple-inheritance


【解决方案1】:

在所有三个类中使用super(),可以确保每个初始化器都以正确的顺序调用,并且只需要显式处理自己的新属性。

class Person:
    def __init__(self, first_name, last_name, date_of_birth, **kwargs):
        super().__init__(**kwargs)
        self.first_name = first_name
        self.last_name = last_name
        self.date_of_birth = date_of_birth

    def get_details(self):
        return(f"Name: {self.first_name} {self.last_name}\nDate of Birth: {self.date_of_birth}")


class Worker:
    def__init__(self, tax_file_number, super_number, **kwargs):
        super().__init__(**kwargs)
        self.tax_file_number = tax_file_number
        self.super_number = super_number

    def get_info(self):
        return(f"TFN: {self.tax_file_number}\nSuper: {self.super_number}")


class Employee(Person, Worker):
    def __init__(self, employee_id, position, **kwargs):
        super().__init__(**kwargs)
        self.employee_id = employee_id
        self.position = position

    def get_info(self):
        return(f"Employee ID: {self.employee_id}\nPosition: {self.position}")
        
    def get_details(self):
        person = (Person.get_details(self)) + "\n" + (Employee.get_info(self)) + "\n" + (Worker.get_info(self))
        return person


e = Employee(first_name='Kim', last_name='White', date_of_birth='12/08/2020', tax_file_number=4556655, super_number=567, employee_id=1121, position='Developer')

每个__init__方法只需要命名它引入的属性即可;任何其他关键字参数都传递给父类。最终,对super().__init__ 的调用之一应该调用object.__init__,此时您应该已经“消耗”了所有关键字参数并且kwargs 应该为空。

有关正确使用super 支持多重继承的更多信息,请参阅Python's super() considered super!


您也可以类似地在每个类中定义get_details(),返回super().get_details + "\n" + [my details here]

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 2021-05-16
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2012-08-08
    • 2021-05-08
    相关资源
    最近更新 更多