2010-01-31 5 views
7

Angenommen, Sie haben eine öffentliche Methode in Python, deren Hauptzweck es ist, den Wert eines zugrunde liegenden Datenattributs (d. H. Interner Sicherungsspeicher) abzurufen. Die Methode kann eine verzögerte Auswertungslogik usw. haben. Eine Eigenschaft ist ein Beispiel für eine solche Methode.Was ist in Python eine bevorzugte Namenskonvention für den Backing Store einer internen Eigenschaft?

Dann ist es natürlich, den gleichen Namen für die Methode und das Datenattribut zu verwenden, außer für ein Unterstrichpräfix für das Datenattribut. Für example--

class C(object): 
def __init__(self): 
    self._x = None 

@property 
def x(self): 
    """I'm the 'x' property.""" 
    return self._x 

(von Python's "property" documentation)

Aber was sind einige bevorzugte Konventionen, wenn das Verfahren für den internen Gebrauch bestimmt und so wird sich mit einem Unterstrich voran? Wenn Sie den Backing Store mit zwei führenden Unterstrichen vorfixieren, wird der Name Mangling aufgerufen und ist daher nicht ideal.

Zwei Möglichkeiten

def _get_x(self): 
    return self._x 

def _x(self): 
    return self._x_ 

Python-Stil, sagt der zweite (Anfügen eines Unterstrichs) be-- könnte, sollte aber nur mit reservierten Schlüsselwörter um Konflikte zu vermeiden verwendet werden.

+0

Ich bin froh, dass die Kommentare nicht -1 Punktzahl haben. –

+0

Ich denke, eine private Immobilie wird viele Menschen verwirren. Ich würde vorschlagen, Ihre eigene Klasse von 'property' abzuleiten, vielleicht' cached_property', und definierend '__get__', damit sie den Getter aufruft, falls dies noch nicht geschehen ist, und falls dies der Fall ist, den zurückgegebenen Wert zurückgeben hieß. Und definieren Sie '__delete__', um den zwischengespeicherten Wert zu vergessen. – Omnifarious

+0

Ich habe gerade eine davon für mich selbst geschrieben, um zu sehen, ob es gemacht werden könnte. Und das kann es auch, aber es ist ein bisschen hässlich und erfordert schwache Referenzen, was bedeutet, dass die Klasse, in die die Eigenschaft eingefügt wird, schwach referenzierbar sein muss. – Omnifarious

Antwort

1

Warum würden Sie es zu einer Eigenschaft machen, wenn es für den internen Gebrauch ist? Wenn es für den internen Gebrauch ist, greifen Sie einfach direkt auf das Attribut zu.

Aber dann würden Sie immer noch einen Unterstrich verwenden, aber nennen Sie es etwas anderes. Aber auch hier ist der ganze Sinn, es zum Eigentum zu machen, verloren gegangen.

+2

Sie möchten es zu einer Eigenschaft machen, wenn es Logik ausführen muss, zum Beispiel faule Auswertung. – cjerdonek

+0

Und dann können Sie diese Methode direkt aufrufen, wenn es intern ist. –

+1

-1 weil das keine Antwort ist, obwohl ich die Frage anfangs falsch gelesen habe und Ihnen die falsche Antwort auf Ihre Frage gegeben hat. @ Chris J hat eine gute Antwort. – Omnifarious

3

Die bevorzugte Konvention besteht darin, einen einzelnen führenden Unterstrich zu verwenden.

Dies ist die PEP 8 Empfehlung für private Attribute.

Sehen Sie dieses Beispiel in der docstring für Immobilien():

>>> help(property) 
Help on class property in module builtins: 

class property(object) 
| property(fget=None, fset=None, fdel=None, doc=None) -> property attribute 
| 
| fget is a function to be used for getting an attribute value, and likewise 
| fset is a function for setting, and fdel a function for del'ing, an 
| attribute. Typical use is to define a managed attribute x: 
| class C(object): 
|  def getx(self): return self._x 
|  def setx(self, value): self._x = value 
|  def delx(self): del self._x 
|  x = property(getx, setx, delx, "I'm the 'x' property.") 
| 
| Decorators make defining new properties or modifying existing ones easy: 
| class C(object): 
|  @property 
|  def x(self): return self._x 
|  @x.setter 
|  def x(self, value): self._x = value 
|  @x.deleter 
|  def x(self): del self._x 
| 
Verwandte Themen