有没有一种好方法可以使 class 从两个 classes 之一继承

Is there a good way to make a class inherit from one of two classes

我想知道是否有使 class 从两个选项中的任何一个继承的好方法。假设我有一名员工、一名开发人员和一名经理 class。 Developer 继承自 Employee,很简单,Manager 应该继承自 Employee 或 Developer。所以本质上总是从 Empolyee 继承,也可能从 Developer 继承。有没有办法做到这一点?或者我是否以某种方式使它复杂化并且首先不应该使用继承。

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

这是我的经理 class,我的解决方法很棘手,我基本上是在检查传递的参数的长度并确定它们是否属于员工的开发人员:

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

我的员工和开发人员class是这些:

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

我还在这里评论了另一个较小的问题,我觉得如果我只能使用 class 中的一个 "layer" 我可以继承。为什么我需要将所有参数传递给 __init__(),为什么 python 不只是找出子 class 需要的其他参数并将它们传递给 "under the hood" .

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

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

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

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 argument 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')