Есть хороший способ сделать класс наследовать от одного из двух классов - PullRequest
1 голос
/ 19 октября 2019

Я хочу знать, есть ли хороший способ заставить класс наследовать один из двух вариантов. Допустим, у меня есть класс Employee, Devloper и Manager. Разработчик наследует от Employee, довольно просто, менеджер должен наследовать от Employee или Developer. Таким образом, по сути, всегда наследовать от Empolyee и возможно также от разработчика. Есть ли способ сделать это? Или я как-то усложняю это и не должен в первую очередь использовать наследование.

Я заставил его работать по своему собственному методу, но это похоже на хакерский обходной путь. Может быть, это правильный способ сделать это, но я должен как-то ограничить использование.

Это мой класс менеджера с хакерским обходным решением, я в основном проверяю длину переданных аргументов и решаю, принадлежат ли они разработчикуof 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 не может просто выяснить, что ему понадобится для подклассов, и передать их «под капот».

Пожалуйста, дайте мне знать, еслиЯ делаю любые другие опрометчивые вещи. Я только начал в питоне!

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Когда у меня возникает такая проблема, я использую заводскую функцию:

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')
0 голосов
/ 19 октября 2019

Нет, нет способа изменить базовый класс класса. Вместо этого вы можете сделать два отдельных класса: class Manager(Employee) и class DeveloperManager(Developer, Manager).

...