【问题标题】:Is there a good way to make a class inherit from one of two classes有没有一种好方法可以让一个类从两个类之一继承
【发布时间】:2019-10-18 22:28:46
【问题描述】:

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

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

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

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


    【解决方案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 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')
    

    【讨论】:

      【解决方案2】:

      不,没有办法改变一个类的基类。相反,您可以创建两个单独的类:class Manager(Employee)class DeveloperManager(Developer, Manager)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 2017-03-15
        • 1970-01-01
        • 2021-02-02
        • 2011-02-16
        相关资源
        最近更新 更多