How to create abstract properties in python abstract classes

后端 未结 3 1385
独厮守ぢ
独厮守ぢ 2020-12-04 16:15

In the following code, I create a base abstract class Base. I want all the classes that inherit from Base to provide the name property

相关标签:
3条回答
  • 2020-12-04 16:29

    Since Python 3.3 a bug was fixed meaning the property() decorator is now correctly identified as abstract when applied to an abstract method.

    Note: Order matters, you have to use @property before @abstractmethod

    Python 3.3+: (python docs):

    class C(ABC):
        @property
        @abstractmethod
        def my_abstract_property(self):
            ...
    

    Python 2: (python docs)

    class C(ABC):
        @abstractproperty
        def my_abstract_property(self):
            ...
    
    0 讨论(0)
  • 2020-12-04 16:43

    Based on James answer above

    def compatibleabstractproperty(func):
    
        if sys.version_info > (3, 3):             
            return property(abstractmethod(func))
        else:
            return abstractproperty(func)
    

    and use it as a decorator

    @compatibleabstractproperty
    def env(self):
        raise NotImplementedError()
    
    0 讨论(0)
  • 2020-12-04 16:49

    Until Python 3.3, you cannot nest @abstractmethod and @property.

    Use @abstractproperty to create abstract properties (docs).

    from abc import ABCMeta, abstractmethod, abstractproperty
    
    class Base(object):
        # ...
        @abstractproperty
        def name(self):
            pass
    

    The code now raises the correct exception:

    Traceback (most recent call last):
      File "foo.py", line 36, in 
        b1 = Base_1('abc')  
    TypeError: Can't instantiate abstract class Base_1 with abstract methods name
    
    0 讨论(0)
提交回复
热议问题