Как выполнить частичное наследование

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

class Parent(object):

    def hello(self):
        print 'Hello world'

    def goodbye(self):
        print 'Goodbye world'


class Child(Parent):
    pass

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

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

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

 bruno desthuilliers26 июн. 2012 г., 11:17
Это технически возможно (с несколькими грязными взломами), но это верный запах дизайна. Каков ваш реальный вариант использования?
 Denis26 июн. 2012 г., 11:21
@brunodesthuilliers Как я могу это сделать?
 Ignacio Vazquez-Abrams26 июн. 2012 г., 11:14
 Denis26 июн. 2012 г., 11:18
@ IgnacioVazquez-Abrams Посмотреть постскриптум ит
 shu zOMG chen26 июн. 2012 г., 11:12
Не могли бы вы уточнить, что неудовлетворительно с ответом, данным там?

Ответы на вопрос(4)

class Child(Parent):
    def __getattribute__(self, attr):
        if attr == 'goodbye':
            raise AttributeError()
        return super(Child, self).__getattribute__(attr)
 Denis26 июн. 2012 г., 11:53
Мне не нужно повышать исключение, мне просто нужно, чтобы этот метод отсутствовал
 26 июн. 2012 г., 12:03
@Denis: пожалуйста, попробуйте вызвать несуществующий метод для любого объекта и посмотрите, что происходит (да, возникает ошибка AttributeError).
Решение Вопроса

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

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

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

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

class C(P): pass

del C.goodbye
 26 июн. 2012 г., 11:36
@ Денис Тьфу - поздно вечером - и должен знать, что не должен писать, пока у меня не будет хотя бы двух чашек кофе!
 Denis26 июн. 2012 г., 11:30
Действительно)) Попробуйте запустить свой решить.

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

class HelloParent(object):

    def hello(self):
        print 'Hello world'

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


class Child(HelloParent):
    pass
 Denis26 июн. 2012 г., 11:33
Это хорошее решение, но я не могу изменить состав или использовать классы Mixin. В любом случае +1

Ваш ответ на вопрос