Equivalent of NotImplementedError for fields in Python

前端 未结 8 1344
北海茫月
北海茫月 2020-12-07 18:56

In Python 2.x when you want to mark a method as abstract, you can define it like so:

class Base:
    def foo(self):
        raise NotImplementedError(\"Subcl         


        
8条回答
  •  一向
    一向 (楼主)
    2020-12-07 19:54

    A better way to do this is using Abstract Base Classes:

    import abc
    
    class Foo(abc.ABC):
    
        @property
        @abc.abstractmethod
        def demo_attribute(self):
            raise NotImplementedError
    
        @abc.abstractmethod
        def demo_method(self):
            raise NotImplementedError
    
    class BadBar(Foo):
        pass
    
    class GoodBar(Foo):
    
        demo_attribute = 'yes'
    
        def demo_method(self):
            return self.demo_attribute
    
    bad_bar = BadBar()
    # TypeError: Can't instantiate abstract class BadBar \
    # with abstract methods demo_attribute, demo_method
    
    good_bar = GoodBar()
    # OK
    

    Note that you should still have raise NotImplementedError instead of something like pass, because there is nothing preventing the inheriting class from calling super().demo_method(), and if the abstract demo_method is just pass, this will fail silently.

提交回复
热议问题