2015-09-28 9 views
1

В настоящее время я разрабатываю для python 2, и я пытаюсь использовать абстрактные базовые классы для имитации интерфейсов. У меня есть интерфейс, базовая реализация этого интерфейса и многие подклассы, которые расширяют базовую реализацию. Это выглядит следующим образом:Как неявно использовать базовое определение метода

class Interface(object): 
    __metaclass__ = ABCMeta 

class IAudit(Interface): 
    @abstractproperty 
    def timestamp(self): 
     raise NotImplementedError() 

    @abstractproperty 
    def audit_type(self): 
     raise NotImplementedError() 

class BaseAudit(IAudit): 
    def __init__(self, audit_type): 
     # init logic 
     pass 

    @property 
    def timestamp(self): 
     return self._timestamp 

    @property 
    def audit_type(self): 
     return self._audit_type 

class ConcreteAudit(BaseAudit): 
    def __init__(self, audit_type): 
     # init logic 
     super(ConcreteAudit, self).__init__(audit_type) 
     pass 

Однако PyCharm уведомляет меня, что ConcreteAudit должен реализовать все абстрактные методы. Однако BaseAudit (который не указан как abc) уже реализует эти методы, а ConcreteAudit является подклассом BaseAudit. Почему PyCharm предупреждает меня? Не следует ли обнаружить, что контракт IAudit уже реализован через BaseAudit?

ответ

2

Почему PyCharm предупреждает вас?

Потому что все Python IDEs сосать, вот почему.

Всякий раз, когда стажер/младший программист/эксперт говорит мне, что что-то, что я написал, не работает для него, я говорю ему, что я не обсуждаю его, пока он не попытается выполнить его, выполнив скрипт Python из командной строки или от биржевого переводчика. В 99% случаев проблема исчезает.

Почему они сосут? Ударь меня. Но все они иногда скрывают исключения, иногда дают возможность импортировать вещи, о которых вы не знали, и все иногда решают (как в этом случае), что что-то проблематично, что реальная программа, работающая на биржевом интерпретаторе, просто не будет иметь проблема с.

Я пробовал использовать код как в Python 2.7, так и в Python 3.4, и до тех пор, пока я добавляю from abc import ABCMeta, abstractproperty вверху, он работает отлично.

Так что просто вырезайте PyCharm или обновите теги, чтобы показать, где находится ошибка.