Вызов базового класса только в том случае, если в Python его нет - PullRequest
0 голосов
/ 15 июня 2011

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

Это то, что у меня есть, похоже, работает, но мне интересно, есть ли более простой или более питонский способ.

class A(object):
    def __init__(self):
        pass

    def Run(self):
        print "Calling A.Run()"

class B(A):
    def __init__(self):
        A.__init__(self)
        pass

    def Run(self):
        print "Calling B.Run()"


subs = A.__subclasses__()

if subs: inst = [i() for i in subs]
else: inst = [A()]

[each.Run() for each in inst]

Ответы [ 2 ]

1 голос
/ 15 июня 2011

То, что у вас есть, выглядит правильно, за исключением того, что большинство программистов смотрят на метод B.Run и думают: «О, он забыл назвать супер. Позвольте мне просто добавить это ...», но я уверен, что выобъясните, что вы делаете в своей реальной реализации:)

Если вы беспокоитесь о чем-то вроде нарезки в C ++, то будьте уверены.То, что у вас есть, хорошо.

Что касается того, как сделать это "проще", я не уверен, как вы могли бы упростить его, кроме удаления пустой функции __init__ А и удаления pass из __init__ Б.

1 голос
/ 15 июня 2011

Я хочу вызывать метод 'Run' из базового класса, только если он не разделен на подклассы, иначе только вызывать метод 'Run' из подклассов.

Это то, чтопроисходит по умолчанию, вызывается самый специфический метод.

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

class C(object):
    def Run(self):
        if self.__class__ != C:
            raise NotImplementedError("You need to override this method")
...