Вопрос по python, inheritance – Как выполнить частичное наследование

3

У меня есть два класса, например:

class Parent(object):

    def hello(self):
        print 'Hello world'

    def goodbye(self):
        print 'Goodbye world'


class Child(Parent):
    pass

Класс Child должен наследовать только метод hello () от Parent, и о goodbye () упоминаться не должно. Является ли это возможным ?

да я читаюэтот

Важное примечание: и я могу изменять только дочерний класс (в родительском классе все возможные должны быть оставлены как есть)

Это технически возможно (с несколькими грязными взломами), но это верный запах дизайна. Каков ваш реальный вариант использования? bruno desthuilliers
возможный дубликатIs it possible to do partial inheritance with Python? Ignacio Vazquez-Abrams
@brunodesthuilliers Как я могу это сделать? Denis
@ IgnacioVazquez-Abrams Посмотреть постскриптум ит Denis
Не могли бы вы уточнить, что неудовлетворительно с ответом, данным там? shu zOMG chen

Ваш Ответ

4   ответа
12

Решение зависит от того, почему вы хотите это сделать. Если вы хотите быть в безопасности от ошибочного использования класса в будущем, я сделаю следующее:

class Parent(object):
    def hello(self):
        print 'Hello world'
    def goodbye(self):
        print 'Goodbye world'

class Child(Parent):
    def goodbye(self):
        raise NotImplementedError

Это явно, и вы можете включить объяснение в сообщение об исключении.

Если вы не хотите использовать много методов из родительского класса, лучшим стилем будет использование композиции вместо наследования:

class Parent(object):
    def hello(self):
        print 'Hello world'
    def goodbye(self):
        print 'Goodbye world'

class Child:
    def __init__(self):
        self.buddy = Parent()
    def hello(self):
        return self.buddy.hello()
-2

Прямой простой ответ:

class P(object):
    def hello(self): print 'hello'
    def goodbye(self): print 'goodbye'

class C(P): pass

del C.goodbye
@ Денис Тьфу - поздно вечером - и должен знать, что не должен писать, пока у меня не будет хотя бы двух чашек кофе!
Действительно)) Попробуйте запустить свой решить. Denis
0

Этот пример Python показывает, как проектировать классы для достижения наследования дочерних классов:

class HelloParent(object):

    def hello(self):
        print 'Hello world'

class Parent(HelloParent):
    def goodbye(self):
        print 'Goodbye world'


class Child(HelloParent):
    pass
Это хорошее решение, но я не могу изменить состав или использовать классы Mixin. В любом случае +1 Denis
2
class Child(Parent):
    def __getattribute__(self, attr):
        if attr == 'goodbye':
            raise AttributeError()
        return super(Child, self).__getattribute__(attr)
Мне не нужно повышать исключение, мне просто нужно, чтобы этот метод отсутствовал Denis
@Denis: пожалуйста, попробуйте вызвать несуществующий метод для любого объекта и посмотрите, что происходит (да, возникает ошибка AttributeError).

Похожие вопросы