2010-01-31 12 views
7

Powiedzmy, że w Pythonie masz publiczną metodę, której głównym celem jest pobranie wartości podstawowego atrybutu danych (tj. Wewnętrznego magazynu kopii zapasowych). Metoda może mieć leniwą logikę oceny, itp. Właściwość jest przykładem takiej metody.W języku Python, jaka jest preferowana konwencja nazywania dla magazynu wewnętrznego właściwości wewnętrznej?

Jest zatem naturalne, aby użyć tej samej nazwy dla metody i atrybutu danych, z wyjątkiem przedrostka podkreślenia dla atrybutu danych. Dla example--

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

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

(od Python's "property" documentation)

Ale jakie są korzystnymi konwencje czy metoda jest do użytku wewnętrznego i tak samo jest z prefiksem znaku podkreślenia? Przedrostek magazynu z dwoma wiodącymi znakami podkreślenia wywoła wymieszanie nazw, a więc nie jest idealny.

dwie możliwości może być:

def _get_x(self): 
    return self._x 

def _x(self): 
    return self._x_ 

Python styl mówi drugi (dodanie podkreślenia), choć powinny być wykorzystywane tylko w celu uniknięcia konfliktów z zastrzeżonych słów kluczowych.

+0

Cieszę się, że komentarze nie mogą mieć -1 wynik. –

+0

Myślę, że posiadanie prywatnej nieruchomości wprowadzi w błąd wiele osób. Sugerowałbym wyprowadzenie własnej klasy z 'property' zwanej, być może,' cached_property' i zdefiniowanie '__get__', aby wywołać getter, jeśli jeszcze nie był, a jeśli tak, zwrócił wartość, która została zwrócona, gdy został wywołany. I zdefiniuj '__delete__', aby zapomnieć o wartości buforowanej. – Omnifarious

+0

Właśnie napisałem jeden z nich dla siebie, aby sprawdzić, czy da się to zrobić. I rzeczywiście może, ale jest trochę brzydka i wymaga użycia słabych referencji, co oznacza, że ​​klasa, w której znajduje się dana nieruchomość, musi być słabo referencyjna. – Omnifarious

Odpowiedz

1

Po co byłaby to własność, jeśli służy do użytku wewnętrznego? Jeśli jest przeznaczony do użytku wewnętrznego, po prostu uzyskaj bezpośredni dostęp do atrybutu.

Ale nadal używałbyś jednego podkreślenia, ale nazwałbyś to czymś innym. Ale w tym przypadku traci się cały sens tworzenia własności.

+2

Użytkownik chciałby uczynić z niego własność, jeśli musi wykonać logikę, na przykład leniwą ocenę. – cjerdonek

+0

A następnie możesz wywołać tę metodę bezpośrednio, gdy jest wewnętrzna. –

+1

-1 ponieważ nie jest to odpowiedź, chociaż początkowo błędnie odczytałem pytanie, a więc podałem niewłaściwą odpowiedź na twoje pytanie. @Chris J ma dobrą odpowiedź. – Omnifarious

3

Preferowaną konwencją jest użycie pojedynczego wiodącego podkreślenia. To jest zalecenie PEP 8 dla atrybutów prywatnych.

Zobacz ten przykład w docstring na nieruchomości():

>>> 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 
| 
Powiązane problemy