2010-01-31 3 views
7

기본 데이터 속성 (즉, 내부 백업 저장소)의 값을 검색하는 것이 주된 Python 공용 메소드가 있다고 가정 해보십시오. 이 방법은 게으른 평가 논리 (lazy evaluation logic) 등을 가질 수있다. 속성은 그러한 방법의 한 예이다.Python에서 내부 속성의 기본 저장소에 대한 기본 명명 규칙은 무엇입니까?

그런 다음 데이터 속성의 밑줄 접두어를 제외하고 메서드 및 데이터 속성에 동일한 이름을 사용하는 것이 당연합니다. (Python's "property" documentation에서) example--

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

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

그러나이 방법은 내부 사용하는 경우 몇 가지 기본 규칙 무엇 때문에 그 자체가 밑줄로 시작되는 내용은? 배킹 스토어 앞에 두 개의 밑줄을 붙이면 이름 맹 글링을 불러 오므로 이상적인 것은 아닙니다.

두 가지 가능성이

def _get_x(self): 
    return self._x 

def _x(self): 
    return self._x_ 

파이썬 스타일 (밑줄을 추가) 두 번째 말한다 이따가 수도 있지만, 단지 예약 된 키워드와 충돌을 피하기 위해 사용되어야한다.

+0

내가 코멘트 -1 점수를 가질 수 없습니다 기뻐요. –

+0

개인 재산을 가지고 있으면 많은 사람들이 혼란 스러울 것이라고 생각합니다. 아마도'cached_property'라고 불리는'property'에서 자신 만의 클래스를 파생시키고 getter를 아직 호출하지 않았다면 getter를 호출하기 위해'__get__'을 정의하고, 아직 가지고 있지 않다면 리턴 한 값을 반환 할 것을 제안합니다. 라고 불렀다. 그리고'__delete__'를 정의하여 캐시 된 값을 잊어 버리십시오. – Omnifarious

+0

나는 그것을 할 수 있는지를보기 위해 나 자신을 위해 그 중 하나를 썼다. 실제로 그렇게 할 수는 있지만 약간 추한 것입니다. 약한 참조를 사용해야합니다. 즉, 속성이 들어있는 클래스는 약한 참조 가능이어야합니다. – Omnifarious

답변

1

내부 용도로 사용하는 이유는 무엇입니까? 내부 용이라면 직접 속성에 액세스하십시오.

하지만 여전히 하나의 밑줄을 사용하지만 다른 것으로 지정하십시오. 그러나 다시 한번, 재산으로 만드는 모든 점은이 경우 상실됩니다.

+2

lazy evaluation과 같이 논리를 실행해야하는 경우이를 속성으로 지정하고자 할 수 있습니다. – cjerdonek

+0

그리고 그 메소드가 내부 일 때 직접 호출 할 수 있습니다. –

+1

-1 이것은 대답이 아니기 때문에 처음에는 질문을 잘못 읽었으므로 질문에 대한 잘못된 답변을 주셨습니다. @Chris J는 좋은 대답을 가지고 있습니다. – Omnifarious

3

선호하는 규칙은 하나의 선행 밑줄을 사용하는 것입니다.

개인 속성에 대한 권장 값은 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 
| 
관련 문제