Вы можете сделать это с помощью простой проверки в конструкторе, как предложил ciphor, но вы также можете использовать декоратор abc.abstractproperty в базовом классе, чтобы убедиться, что свойство, подобное тому, которое вы хотите, являетсяопределены.
Затем интерпретатор проверит, что при создании экземпляра создается файл журнала:
import abc
#It is almost always a good idea to have your base class inherit from object
class Base(object):
__metaclass__ = abc.ABCMeta
@abc.abstractproperty
def logfile(self):
raise RuntimeError("This should never happen")
class Nice(Base):
@property
def logfile(self):
return "actual_file.log"
class Naughty(Base):
pass
d=Nice() #This is fine
print d.logfile #Prints actual_file.log
d=Naughty() #This raises an error:
#TypeError: Can't instantiate abstract class Base with abstract methods logfile
См. http://docs.python.org/library/abc.html и, возможно, более полезно: http://www.doughellmann.com/PyMOTW/abc/ дляподробнее ...
Еще одно замечание - если в вашем исходном примере ваши подклассы вызывают Base.display (self), имело бы больше смысла вызывать self.display ().Метод наследуется от базового, и таким образом избегает жесткого кодирования базового класса.Если у вас есть больше подклассов, это также делает цепочку наследования более чистой.