В Python, каково предпочтительное соглашение об именах для резервного хранилища внутреннего свойства? - PullRequest
8 голосов
/ 01 февраля 2010

Скажем, у вас есть открытый метод в Python, основной целью которого является получение значения базового атрибута данных (то есть внутреннего резервного хранилища). Метод может иметь ленивую логику оценки и т. Д. Свойство является примером такого метода.

Тогда естественно использовать одно и то же имя для метода и атрибута данных, за исключением префикса подчеркивания для атрибута данных. Например -

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

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

(из документации "свойства" Python )

Но каковы некоторые предпочтительные соглашения, если метод предназначен для внутреннего использования и поэтому сам по себе префикс подчеркивания? Добавление префикса к резервному хранилищу с двумя ведущими символами подчеркивания приведет к искажению имени и поэтому не является идеальным.

Две возможности могут быть -

def _get_x(self):
    return self._x

def _x(self):
    return self._x_

Стиль Python говорит, что второе (добавление подчеркивания), тем не менее, должно использоваться только во избежание конфликтов с зарезервированными ключевыми словами.

Ответы [ 2 ]

4 голосов
/ 01 марта 2013

Предпочтительным условием является использование единственного нижнего подчеркивания.

Это рекомендация PEP 8 для личных атрибутов.

См. Этот пример в строке документации для свойства ():

>>> 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
 |  
1 голос
/ 01 февраля 2010

Зачем вам делать это свойством, если оно предназначено для внутреннего использования? Если это для внутреннего использования, просто обратитесь к атрибуту напрямую.

Но тогда вы все равно использовали бы одно подчеркивание, но называли бы это как-то иначе. Но опять же, весь смысл превращения его в собственность теряется в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...