5

Google Python style guide concerning properties의 권장 사항 중 하나에 대해 궁금합니다. 로 ___get_area___set_area을 "간접"를 세 밑줄을 사용하는 이점은 무엇getter 및 setter 용 Google 스타일 가이드 속성

  1. : 나는이 개 이것에 대해 질문이

    class Square(object): 
        """A square with two properties: a writable area and a read-only perimeter. 
    
        To use: 
        >>> sq = Square(3) 
        >>> sq.area 
        9 
        >>> sq.perimeter 
        12 
        >>> sq.area = 16 
        >>> sq.side 
        4 
        >>> sq.perimeter 
        16 
        """ 
    
        def __init__(self, side): 
         self.side = side 
    
        def __get_area(self): 
         """Calculates the 'area' property.""" 
         return self.side ** 2 
    
        def ___get_area(self): 
         """Indirect accessor for 'area' property.""" 
         return self.__get_area() 
    
        def __set_area(self, area): 
         """Sets the 'area' property.""" 
         self.side = math.sqrt(area) 
    
        def ___set_area(self, area): 
         """Indirect setter for 'area' property.""" 
         self.__set_area(area) 
    
        area = property(___get_area, ___set_area, 
            doc="""Gets or sets the area of the square.""") 
    
        @property 
        def perimeter(self): 
         return self.side * 4 
    

    :

    는, 그들은 다음과 같은 예제를 제공 두 개의 밑줄 문자를 사용하는 것 이상의 두 개의 밑줄 문자로도 사용할 수 있습니까? 왜 오히려 같은 것을하는 것보다, 더블, 트리플 밑줄 방법이 집합하는 방법으로 property()를 사용

  2. :

    @property 
    def area(self): 
        return self.side ** 2 
    
    @area.setter 
    def area(self, value): 
        self.side = math.sqrt(value) 
    
    그들이 이유를 제공 할 스타일 가이드에서

답변

12

:

속성 자체를 재정의하지 않으면 속성을 사용하여 상속 할 수 있습니다. 따라서 접근 자 메소드가 간접적으로 호출되어 서브 클래스에서 재정의 된 메소드가 (Template Method DP를 사용하여) 특성에 의해 호출되는지 확인해야합니다.

은 (템플릿 방법 DP 알렉스 마르 텔리, 구글 Pythonista 비범)에 의해 Template Method Design Pattern (슬라이드 곳입니다.

그래서 그들은 서브 클래스를 구현을 재정의 할 수있는 기회를 제공하고, 제공 할 property . 당신이이를 대체 할 수 있도록 트리플 밑줄 버전은 이중 밑줄 메소드를 호출 당신은이 경우에 변환 된 이름을 밖으로 철자해야 할 것 : w를 내놓았다 분명히 사람들

class WonkySquare(Square): 
    def _Square__get_area(self): 
     return self.square ** 2 + 0.5 

을 이 제도는 단지 게터 또는 재산의 세터를 대체 할 수 있음을 알지도 못하는 i 번째, Python overriding getter without setter를 참조하십시오

class ProperlySubclassedSquare(Square): 
    @Square.area.getter 
    def area(self): 
     return self.square ** 2 + (0.5 - 0.5) 

그런 다음 다시, getter, setterdeleter 장식 속성은 파이썬 2.6에 추가되었습니다. 스타일 가이드는 이전 버전의 Python 용으로 작성된 것이 틀림 없습니다.

2.6 이상인 경우 @propname.setter 패턴을 대신 사용하십시오.

+0

고마워요! 그럼, 만약 내가 제대로 이해하고있어, 당신은 내 질문 # 2 (즉 @ 속성 및 @ area.setter)에서 말한 일을하는 것이 좋습니다거야 그리고 ProperlySubclassedSquare에서 귀하의 방법을 사용하여 하위 클래스? – mindvirus

+0

@mdkess : 절대적으로; 스타일 가이드는 구형 Python 버전 용으로 작성되었습니다. –