확실하지 않은 경우 "공개"상태로 두십시오. 속성 이름을 가리기 위해 아무것도 추가하지 마십시오. 내부 가치가있는 수업이 있다면 신경 쓰지 마십시오. 작성하는 대신 :
class Stack(object):
def __init__(self):
self.__storage = [] # Too uptight
def push(self, value):
self.__storage.append(value)
기본적으로 작성하십시오.
class Stack(object):
def __init__(self):
self.storage = [] # No mangling
def push(self, value):
self.storage.append(value)
이것은 확실히 논란의 여지가있는 일을하는 방법입니다. Python 초보자는이 기본값을 싫어하고 일부 오래된 Python 사용자도이 기본값을 경멸합니다. 그러나 어쨌든 기본값이므로 불편 함을 느끼더라도 따라가는 것이 좋습니다.
당신이 경우 실제로 메시지를 보내려면 "이 접촉 할 수 없습니다!" 사용자에게 일반적인 방법은 변수 앞에 밑줄 하나를 추가하는 것 입니다. 이것은 단지 관습이지만 사람들은 그것을 이해하고 그러한 것들을 다룰 때 두 배의주의를 기울입니다.
class Stack(object):
def __init__(self):
self._storage = [] # This is ok but pythonistas use it to be relaxed about it
def push(self, value):
self._storage.append(value)
속성 이름과 속성 이름 간의 충돌을 피하는데도 유용 할 수 있습니다.
class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age if age >= 0 else 0
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age >= 0:
self._age = age
else:
self._age = 0
이중 밑줄은 어떻습니까? 글쎄, 이중 밑줄 마법은 주로 메서드의 우발적 오버로딩과 슈퍼 클래스의 속성과 이름 충돌을 피하기 위해 사용됩니다 . 여러 번 확장 될 것으로 예상되는 클래스를 작성하는 경우 매우 유용 할 수 있습니다.
다른 용도로 사용하고 싶다면 할 수 있지만 일반적이거나 권장하지 않습니다.
편집 : 왜 그렇게? 글쎄, 일반적인 파이썬 스타일은 사물을 비공개로 만드는 것을 강조하지 않습니다. 반대로! 많은 이유가 있습니다. 대부분 논란이되고 있습니다. 몇 가지를 살펴 보겠습니다.
파이썬에는 속성이 있습니다
오늘날 대부분의 OO 언어는 반대 접근 방식을 사용합니다. 사용해서는 안되는 것은 보이지 않아야하므로 속성은 비공개 여야합니다. 이론적으로 이것은 아무도 객체 내부의 값을 무모하게 변경하지 않기 때문에 더 관리하기 쉽고 결합이 적은 클래스를 생성합니다.
그러나 그렇게 간단하지 않습니다. 예를 들어, 자바 클래스는 많은 속성이 있습니까 및 단지 게터 얻을 값 과 바로 세터 설정 값을. 단일 속성을 선언하려면 7 줄의 코드가 필요합니다. 파이썬 프로그래머는 불필요하게 복잡하다고 말할 것입니다. 또한 실제로는 getter 및 setter를 사용하여 값을 변경할 수 있으므로 하나의 공용 필드를 얻기 위해이 많은 코드를 작성하기 만하면됩니다.
그렇다면이 기본 정책을 따르는 이유는 무엇입니까? 기본적으로 속성을 공개하십시오. 물론 이것은 Java에서 문제가됩니다. 속성에 일부 유효성 검사를 추가하기로 결정하면 모든 항목을 변경해야하기 때문입니다.
person.age = age;
귀하의 코드에서
person.setAge(age);
setAge()
존재:
public void setAge(int age) {
if (age >= 0) {
this.age = age;
} else {
this.age = 0;
}
}
따라서 Java (및 기타 언어)에서 기본값은 어쨌든 getter 및 setter를 사용하는 것입니다. 왜냐하면 작성하기가 귀찮을 수 있지만 제가 설명한 상황에 처해 있다면 많은 시간을 절약 할 수 있기 때문입니다.
그러나 Python에는 속성이 있으므로 Python에서 수행 할 필요가 없습니다. 이 수업이있는 경우 :
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
그런 다음 나이를 확인하기로 결정하면 person.age = age
코드 조각 을 변경할 필요가 없습니다 . 속성을 추가하기 만하면됩니다 (아래 그림 참조).
class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age if age >= 0 else 0
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age >= 0:
self._age = age
else:
self._age = 0
할 수 있고 여전히을 사용 person.age = age
한다면 왜 private 필드와 getter 및 setter를 추가합니까?
(또한 참조 파이썬은 자바하지 않습니다 및 getter 및 setter를 사용하는 피해에 대한이 문서 .).
어쨌든 모든 것을 볼 수 있으며 숨기려고하면 작업이 복잡해집니다.
개인 속성이있는 언어에서도 일종의 리플렉션 / 인트로 스펙 션 라이브러리를 통해 액세스 할 수 있습니다. 그리고 사람들은 프레임 워크와 긴급한 요구를 해결하기 위해 많은 일을합니다. 문제는 인트로 스펙 션 라이브러리가 공용 속성으로 할 수있는 작업을 수행하기 어려운 방법이라는 것입니다.
Python은 매우 동적 인 언어이므로 클래스에 이러한 부담을 더하는 것은 비생산적입니다.
문제를 볼 수 없습니다. 볼 필요 가 있습니다.
Pythonista의 경우 캡슐화는 클래스의 내부를 볼 수없는 것이 아니라 그것을 보지 않을 가능성입니다. 내 말은, 캡슐화는 사용자가 내부 세부 사항에 대해 걱정하지 않고 사용할 수 있도록하는 구성 요소의 속성입니다. 구현에 대해 신경 쓰지 않고 컴포넌트를 사용할 수 있다면 캡슐화됩니다 (Python 프로그래머의 의견).
이제 구현 세부 사항에 대해 생각할 필요없이 사용할 수있는 방식으로 클래스를 작성했다면 어떤 이유로 클래스 내부를 살펴보고 싶은 경우에는 문제가 없습니다 . 요점은 API가 훌륭해야하고 나머지는 세부 사항이라는 것입니다.
귀도는 그렇게 말했다
글쎄, 이것은 논란의 여지가 없습니다. 그는 실제로 그렇게 말했습니다 . ( "오픈 기모노"를 찾으십시오.)
이것은 문화입니다
예, 몇 가지 이유가 있지만 중요한 이유는 없습니다. 이것은 대부분 Python 프로그래밍의 문화적 측면입니다. 솔직히 그 반대 일 수도 있지만 그렇지 않습니다. 또한 다른 방법으로 쉽게 질문 할 수 있습니다. 일부 언어는 기본적으로 개인 속성을 사용하는 이유는 무엇입니까? 파이썬 연습과 동일한 주된 이유는 이러한 언어의 문화이기 때문에 각 선택에는 장단점이 있습니다.
이 문화가 이미 있기 때문에 따라가는 것이 좋습니다. 그렇지 않으면 Python 프로그래머가 __
Stack Overflow에서 질문 할 때 코드에서 를 제거하라고 말하는 짜증을 낼 것입니다. :)