문제

한 두 가지가 아닌 클래스와 몇 가지 특성이 있습니다.어떻게 그것이 최고의(에 Pythonic-OOP)감 액세스하는 이러한 특성은?처럼 obj.attr ?또는 아마도 작성을 얻을 접근?무엇인가 받아들여 이름 스타일 등에 대한 것인가?

편집: 할 수 있습니에 정교한 최고의 모범 사례의 이름 특성으로 하나 또는 두개의 밑줄 주요?나는 대부분의 모듈에는 단 밑줄을 사용합니다.


는 경우 이 질문습니다(그리고 내가 예감하고 있지만 검색되지 않은 결과),주시기 바랍점을 그것을 가까 이 하나입니다.

도움이 되었습니까?

해결책

일반적으로 인정되는 일을하는 방법은 단순한 속성을 사용하는 것입니다.

>>> class MyClass:
...     myAttribute = 0
... 
>>> c = MyClass()
>>> c.myAttribute 
0
>>> c.myAttribute = 1
>>> c.myAttribute
1

Getters와 Setters를 쓸 수 있어야한다면 자신이 찾고 싶은 것은 "Python Class Properties"및 Ryan Tomayko의 Getters/Setters/Fuxors에 관한 기사 시작하기에 좋은 곳입니다 (조금 길지만)

다른 팁

과 관련하여 단일 및 이중 최고의 밑줄:모두 동일하게 표시'의 개념 privateness'.그 말은,사람들이 알고 있는 특성(수 있는 방법 또는'정상'데이터 특성이나 다른 아무것도)의 일부가 아닌 공공의 API 개체입니다.사람들이 알고 있는 터치하는 직접을 초대하는 것입니다.

의 상단에는,이중 최고의 밑줄 속성(하지만 하나의 선도하는 밑줄 속성용) 이름-망가 게 액세스할 사고에 의하여 서브 클래스에서 또는 다른 곳에서는 밖에서 현재 클래스 가능성이 적습니다.액세스할 수 있습니다 그들을,하지만 사소.예를 들어:

>>> class ClassA:
...     def __init__(self):
...         self._single = "Single"
...         self.__double = "Double"
...     def getSingle(self):
...         return self._single
...     def getDouble(self):
...         return self.__double
... 
>>> class ClassB(ClassA):
...     def getSingle_B(self):
...         return self._single
...     def getDouble_B(self):
...         return self.__double
... 
>>> a = ClassA()
>>> b = ClassB()

당신은 지금 사소 액세스 a._singleb._single_single 특성에 의해 만들어 ClassA:

>>> a._single, b._single
('Single', 'Single')
>>> a.getSingle(), b.getSingle(), b.getSingle_B()
('Single', 'Single', 'Single')

하지만 액세스하고 __double 특성 ab 인스턴스에 직접 작동 하지 않습니다.

>>> a.__double
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ClassA instance has no attribute '__double'
>>> b.__double
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ClassB instance has no attribute '__double'

그리고 비록 방법에 정의된 ClassA 그것을 얻을 수 있습니다 바로(호출 될 때에 하나 인스턴스):

>>> a.getDouble(), b.getDouble()
('Double', 'Double')

는 방법에 정의된 ClassB 할 수 없습니다:

>>> b.getDouble_B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in getDouble_B
AttributeError: ClassB instance has no attribute '_ClassB__double'

고 오른쪽에 오류가 당신은 힌트를 얻을에 대해 무엇이 일어나고 있습니다.이 __double 속성 이름 액세스할 때 클래스 내에는름-망가의 이름을 포함하는 클래스에 액세스하지 않는 .면 ClassA 액세스하려고 시도 self.__double,그것이 실제로--에 compiletime--으로의 액세스 self._ClassA__double, 와 마찬가지로 대 ClassB.(경우에서 방법 ClassB 을 할당 __double, 에 포함되지 않은 코드를 간단히 하기 위해,그것은 그것을 만지지 ClassAko __double 을 만들어낼 수 있다고 생각합니다 새로운 특성이 있습니다.) 이 없는 다른 보호의 이 특성은,그래서 당신은에 액세스할 수 있습 그것은 바로 당신이 알고 있는 경우 오른쪽 이름:

>>> a._ClassA__double, b._ClassA__double
('Double', 'Double')

그런데 왜 이것이 문제가 되겠습니까?

만,그것의 문제를 언제든지 당신이 원하는 상속 및 변경 행동의 모든 코드를 다루는 특성이 있습니다.당신이 하나가 다시 구현 만지는 모든 이 두 배 밑줄 속성이 있는 직접,또는 당신을 생각해야에서 클래스 이름 및 탈수 이름을 수 있습니다.문제를 악화될 때 이 두 배 밑줄 특성이 실제로 방법:재정의하는 방법 또는 메소드를 호출에 하위 클래스 하름-엉망으로 수동으로 재구현한 모든 코드를 호출하는 방법을 사용하지 더블 밑줄 이름입니다.을 언급하지 않에 액세스하는 특성을 동적으로 getattr():당신 수동으로 압착 롤러 있고,너무합니다.

다른 한편으로,때문에 특성에만 손쉽게 다시 작성,제공에만 표면'보호'.조각의 코드는 아직도 얻을 수 있에 특성에 의해 수동으로 엉망으로만 만들 것입니다 코드에 따라 이름 귀하의 클래스고,노력을 당신의 옆에는 코드를 리팩터링하거나 이름을 바꿀 클래스(동안 여전히 유지하는 동일한 사용자에게 표시되는 이름,일반적인 연습에서는 파이썬)가 불필요하게 휴식 자신의 코드입니다.그들은 또한'속여'Python 으로 하고 있는 이름 엉망으로 그들의 이름을 지정하여 자신의 클래스와 같은 당신:는 방법을 알 수 없 모듈 이름에 포함된 손상 속성 이름입니다.그리고 마지막으로,두 배 밑줄 특성은 여전히 볼 수 있에는 모든 특성을 나열하고 모든 형태의 반성하지 않는 돌을 건너뛰기 특성으로 시작(단일)밑줄입니다.

그래서, 는 경우 당신이 사용하는 밑줄로 이름을 사용하여 그들에게 대단히 드물게,그들이 밖으로 설정할 수 있습니다 아주 불편하고,사용하지 않는 방법에 대 한 이나 다른 아무것도 하위할 수 있습고 싶를 구현,재정의 또는 직접 액세스.고 실현하는 선도하는 밑줄름-엉망으로 제공하는 진짜 보호.에서 끝 사용하여,하나의 선도하는 밑줄로 승리하는 것처럼 많이신 비(잠재적인 미래의)통입니다.사용하는 단일 선도하는 밑줄입니다.

편집 : 단일 또는 이중 선행 밑줄을 가진 가장 좋은 이름 지정 속성에 대해 자세히 설명 할 수 있습니까? 대부분의 모듈에서 단일 밑줄이 사용된다는 것을 알 수 있습니다.

단일 밑줄은 파이썬에 특별한 것을 의미하지는 않습니다. "당신이 무엇을하고 있는지 알지 않으면 이것에 액세스하고 싶지 않을 것"이라고 말하는 것이 가장 좋습니다. 그러나 이중 밑줄은 Python Mangle이 내부적으로 정의 된 클래스에서만 접근 할 수있게합니다.

이중 선두 및 후행 밑줄은 다음과 같은 특수 기능을 나타냅니다. __add__ + 연산자를 사용할 때 호출됩니다.

더 읽어보십시오 PEP 8, 특히 "명명 규칙"섹션.

나는 대부분 직접 액세스 할 필요가 없다고 생각합니다.

>>> class myclass:
...     x = 'hello'
...
>>>
>>> class_inst = myclass()
>>> class_inst.x
'hello'
>>> class_inst.x = 'world'
>>> class_inst.x
'world'

btw, dir () 함수를 사용하여 인스턴스에 어떤 속성/메소드가 첨부되는지 확인할 수 있습니다.

>>> dir(class_inst)
['__doc__', '__module__', 'x']

"__"라는 두 개의 주요 언더 바가 속성이나 기능을 비공개로 만드는 데 사용됩니다. 다른 규칙은 PEP 08을 참조하십시오.http://www.python.org/dev/peps/pep-0008/

Python은 속성을 속성으로 변환하는 것이 빠르고 통증이 없기 때문에 처음부터 액세서를 정의 할 필요가 없습니다. 생생한 데모는 다음을 참조하십시오.

중독으로부터의 회복

파이썬에는 getter/setters를 수행 할 수있는 실제 포인트가 없습니다. ) ')

어떤 사람들은 사용하여 구현.에 따라 코딩 스타일에 당신이 사용할 수 있는 그 이름 getSpam 및 seteggs.하지만 당신은 또한 당신은 특성을 읽기 전용 또는 할당합니다.는 어색한다.하나의 방법으로 재정의

> __getattr__

> __setattr__

방법이 있습니다.

편집:

는 동안 저의 대답입니다 여전히 사실,그것은 오른쪽으로,I came to realize.더 좋은 방법이 있다는 것을 확인 접근에서는 파이썬은 매우 어색하다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top