5

Ich bin neugierig auf eine der Empfehlungen in der Google Python style guide concerning properties.Google Style Guide Eigenschaften für Getter und Setter

Darin geben sie das folgende Beispiel:

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 

Ich habe zwei Fragen dazu:

  1. Was ist der Nutzen der Verwendung der drei Unterstrich „Umweg“ ist ___get_area und ___set_area als genau wie zwei Unterstriche, anstatt nur die beiden Unterstriche direkt zu verwenden?

  2. mit diesem Satz von Doppel- und Dreifachstrich Methoden, Warum eher property() als Methode verwenden, als wie etwas zu tun:

    @property 
    def area(self): 
        return self.side ** 2 
    
    @area.setter 
    def area(self, value): 
        self.side = math.sqrt(value) 
    

Antwort

12

Im Style Guide sie einen Grund tun:

Vererbung mit Eigenschaften kann nicht offensichtlich sein, wenn die Eigenschaft selbst nicht überschrieben wird. Daher muss sichergestellt werden, dass Accessor-Methoden indirekt aufgerufen werden, um sicherzustellen, dass Methoden, die in Unterklassen überschrieben werden, von der Eigenschaft aufgerufen werden (mit der Template-Methode DP).

(wo Template-Methode DP ist das Template Method Design Pattern (Dia von Alex Martelli, Pythonista extraordinaire bei Google).

So wollen sie Subklassen die Möglichkeit geben, die Umsetzung außer Kraft zu setzen, und gibt die property die . triple-Strich Versionen der Doppelstrich Methoden aufrufen, damit Sie diese überschreiben können, würden Sie haben die verstümmelten Namen in diesem Fall buchstabieren:

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

Anscheinend sind die Leute, die w aufkam ith dieses Schema, dass nie wusste, dass Sie nur einen Getter oder Setter einer Eigenschaft außer Kraft setzen können, finden Sie Python overriding getter without setter:

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

Dann wieder, die getter, setter und deleter Dekorateur Attribute in Python 2.6 nur hinzugefügt. Der Style Guide muss für eine ältere Python-Version geschrieben worden sein.

Für 2.6 und höher, bleiben Sie stattdessen an das Muster @propname.setter.

+0

Danke! Also, wenn ich Sie richtig verstehe, würden Sie empfehlen, das zu tun, was ich in meiner Frage # 2 gesagt habe (zB @property und @ area.setter), und dann Unterklassen mit Ihrer Methode in RichtigSubclassedSquare? – mindvirus

+0

@mdkess: absolut; Der Style Guide wurde fast sicher für eine ältere Python-Version geschrieben. –