是否有一种使一个类从两个类之一继承的好方法

问题描述 投票:1回答:2

我想知道是否有一种很好的方法可以使类从两个选项之一继承。假设我有一个Employee,Devloper和Manager类。开发人员从Employee继承,很简单,经理应该从Employee或Developer继承。因此,本质上总是从Empolyee继承,也可能从Developer继承。有没有办法做到这一点?还是我以某种方式使其复杂化,并且一开始就不应该使用继承。

我让它以我自己的污垢方法工作,但感觉像是个棘手的解决方法。也许这是正确的方法,但是我应该以某种方式限制使用。

这是我的经理类,具有变通的解决方法,我基本上是在检查传递的参数的长度,并确定它们是否属于Employee开发人员:

class Manager(Developer or Employee):

    def __init__(self, *args, **kwargs):
        print(args, kwargs)
        if len(args) == 2:
            Employee.__init__(self, *args, **kwargs)
        elif len(args) == 3:
            Developer.__init__(self, *args, **kwargs)
        else:
            print('error')

我的Employee和Developer类是这些:

class Employee:

    def __init__(self, first, last):
        self.first = first
        self.last = last

    def fullname(self):
        return '{} {}'.format(self.first, self.last)

class Developer(Employee):

    def __init__(self, first, last, language):
        super().__init__(first, last) #or Employee.__init__()
        self.language = language

    #Why can i not do something like:
    #def __init__(self, language):
    #    self.language = language
    #And because the class extends Employee it would also need it's arguments, them being in order from lowest on inheritance ladder to highest.

    def getlang(self):
        return self.language

[我还在这里评论了另一个较小的问题,我觉得如果我被限制为只使用我可以继承的类的单个“层”,为什么我需要将所有参数传递给__init__(),为什么python不仅可以弄清楚子类还需要其他什么并将它们传递给“幕后”?

[如果我做其他任何不明智的事情,请告诉我。我刚开始使用python!

python python-3.x inheritance multiple-inheritance
2个回答
1
投票

当我遇到这样的问题时,我使用工厂函数:

class Employee:
      .....

class Developer(Employee):
      ...... 

class DeveloperManager(Developer):
   def __int__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


class EmployeeManager(Employee):
   def __int__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


# Factory to create a manager class based on the args given
def Manager(*args, **kwargs):
    # if language arguement is passed return a developer manager
    if len(args) == 3 or len(args) == 2 and 'language' in kwargs:
        return DeveloperManager(*args, **kwargs)
    elif len(args) == 2:
        return EmployeeManager(*args, **kwargs)
    else:
        print('error')

0
投票

否,无法更改类的基类。相反,您可以创建两个单独的类:class Manager(Employee)class DeveloperManager(Developer, Manager)

© www.soinside.com 2019 - 2024. All rights reserved.