티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

How to create abstract properties in python abstract classes

파이썬 추상 클래스에서 추상 속성을 만드는 방법

 문제 내용 

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, so I made this property an @abstractmethod.

다음 코드에서는 기본 추상 클래스인 Base를 만듭니다. Base에서 상속하는 모든 클래스가 name 속성을 제공하기를 원하므로 이 속성을 @abstractmethod로 만들었습니다.

 

Then I created a subclass of Base, called Base_1, which is meant to supply some functionality, but still remain abstract. There is no name property in Base_1, but nevertheless python instatinates an object of that class without an error. How does one create abstract properties?

그런 다음 Base_1이라는 Base의 하위 클래스를 만들었습니다. 이 하위 클래스는 일부 기능을 제공하지만 여전히 추상적인 상태를 유지합니다. Base_1에는 이름 속성이 없지만 그럼에도 불구하고 파이썬은 오류 없이 해당 클래스의 객체를 초기화합니다. 추상 속성을 어떻게 생성합니까?

 

from abc import ABCMeta, abstractmethod

class Base(object):
    __metaclass__ = ABCMeta
    def __init__(self, strDirConfig):
        self.strDirConfig = strDirConfig
    
    @abstractmethod
    def _doStuff(self, signals):
        pass
    
    @property    
    @abstractmethod
    def name(self):
        # this property will be supplied by the inheriting classes
        # individually
        pass
    

class Base_1(Base):
    __metaclass__ = ABCMeta
    # this class does not provide the name property, should raise an error
    def __init__(self, strDirConfig):
        super(Base_1, self).__init__(strDirConfig)
    
    def _doStuff(self, signals):
        print 'Base_1 does stuff'
        

class C(Base_1):
    @property
    def name(self):
        return 'class C'
    
        
if __name__ == '__main__':
    b1 = Base_1('abc')  

 

 

 높은 점수를 받은 Solution 

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

Python 3.3부터 버그가 수정되어 property() 데코레이터가 이제 추상 메서드에 적용될 때 추상으로 올바르게 식별됩니다.

 

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

참고: 순서가 중요하므로 @abstractmethod 위에 @property를 사용해야 합니다.

 

Python 3.3+: (python docs):

Python 3.3+: (Python 문서):
from abc import ABC, abstractmethod

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

 

Python 2: (python docs)

파이썬 2: (파이썬 문서)
from abc import ABC, abstractproperty

class C(ABC):
    @abstractproperty
    def my_abstract_property(self):
        ...

 

 

 가장 최근 달린 Solution 

In python 3.6+, you can also anotate a variable without providing a default. I find this to be a more concise way to make it abstract.

파이썬 3.6+에서는 기본값을 제공하지 않고 변수에 주석을 달 수도 있습니다. 나는 이것이 그것을 추상적으로 만드는 더 간결한 방법이라고 생각한다.
class Base():
    name: str
    
    def print_name(self):
        print(self.name)  # will raise an Attribute error at runtime if `name` isn't defined in subclass

class Base_1(Base):
    name = "base one"

 

it may also be used to force you to initialize the variable in the __new__ or __init__ methods

또한 __new_ 또는 _init__ 메서드에서 변수를 초기화하는 데 사용할 수 있습니다.

 

As another example, the following code will fail when you try to initialize the Base_1 class

또 다른 예로 Base_1 클래스를 초기화하려고 하면 다음 코드가 실패합니다.
    class Base():
        name: str

        def __init__(self):
            self.print_name()

    class Base_1(Base):
        _nemo = "base one"
    
    b = Base_1() 

AttributeError: 'Base_1' object has no attribute 'name'

 

 

출처 : https://stackoverflow.com/questions/5960337/how-to-create-abstract-properties-in-python-abstract-classes

반응형
댓글
공지사항
최근에 올라온 글