get / set 패턴 (Python에서)을 사용합니까?


82

get / set을 사용하는 것은 (다양한 이유로) Java에서 일반적인 관행 인 것처럼 보이지만 이것을 사용하는 Python 코드는 거의 볼 수 없습니다.

Python에서 get / set 메서드를 사용하거나 피하는 이유는 무엇입니까?


모두의 훌륭한 응답. 물론,이 질문은이 질문의 파생물입니다. stackoverflow.com/questions/1022970/… 그러나 "J"단어의 관점 에서이 질문을 보고있는 많은 사람들에게 습격당한 것 같습니다. 제 정신을 회복 해주셔서 다시 한 번 감사드립니다.
Avery Payne

1
컨텍스트는 중요하며 여기서 Python과 Java는 단순히 다릅니다. (그러나 나는 우리가 SO에서 태그를 사용하기 때문에 제목에서 Python을 제거했습니다.;)

답변:


59

멋진 링크 : Python은 Java가 아닙니다. :)

Java에서는 공용 필드를 사용하면 나중에 getter 및 setter를 사용하도록 마음을 바꿀 기회가 없으므로 getter 및 setter를 사용해야합니다. 따라서 Java에서는 집안일을 앞지르는 것이 좋습니다. Python에서는 클래스의 클라이언트에 영향을주지 않고 일반 속성으로 시작하여 언제든지 마음을 바꿀 수 있기 때문에 이것은 어리석은 일입니다. 따라서 getter 및 setter를 작성하지 마십시오.


3
게다가 setter / getters는 특히 Python에서 성능 비용을 추가합니다.
Nick Dandoulakis 2010

4
이것은 않습니다 암시 적으로 클래스의 공개 API의 일부가 해당 인스턴스 변수에 클래스 디자이너에 추가 부담을. 클래스를 레이아웃 할 때 외부에서 액세스하려는 인스턴스 변수와 실제로 클래스 구현의 일부인 인스턴스 변수를 명시 적으로 생각하십시오. 내부 구현 앞에 '_'를 붙입니다. 이것은 구현이 변경되면이 변수가 너무 변경되거나 완전히 사라질 수 있다는 Python 경고 신호입니다. 그렇지 않으면 클래스에서 구현 지식이 누출되어 나중에 변경하기가 어렵습니다.
PaulMcG 2010

8
@Nick D : 저는 접근자가 파이썬에서 속도 최적화를하기에 적합한 장소라고 생각하지 않습니다.
wRAR 2010

1
@Nick D : 성능이 아닌 가독성을 장려하는 해석 언어이기 때문에 프로그램에서 최적화를위한 훨씬 더 좋은 곳이있을 것입니다.
wRAR 2010

2
@Paul : 하나 또는 두 개의 선행 밑줄로 이름을 지정하지 않는 한 내부 속성 이 아닙니다 (첫 번째 형식은 일반적으로 후자가 Python의 비정상적인 이름 변경을 수행하므로 선호 됨). 문서를 작성하고 싶지 않고이 문제가 문제가되는 경우 모든 인스턴스 속성에 기본적으로 _name을 사용하면됩니다.

113

파이썬에서는 퍼블릭이기 때문에 속성에 직접 액세스 할 수 있습니다.

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

속성의 액세스 또는 변형에 대해 뭔가를 수행하려면 속성을 사용할 수 있습니다 .

class MyClass:

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

결정적으로 클라이언트 코드는 동일하게 유지됩니다.


30

Guido van Rossum 이 프로그래밍의 마스터 마인드 에서 그것에 대해 말하는 것입니다.

"언어와의 싸움"이란 무엇을 의미합니까?

귀도 : 그것은 보통 그들이 다른 언어로 잘 작동하는 습관을 계속하려고한다는 것을 의미합니다.

[...] 사람들은 모든 것을 클래스로 바꾸고 모든 접근을 접근 자 메서드로 바꿀
것입니다. 파이썬에서하는 것은 정말 현명한 일이 아닙니다.
디버그하기 더 어렵고 훨씬 느리게 실행되는 더 자세한 코드가 있습니다. "어떤 언어로든 FORTRAN을 작성할 수 있습니까?"라는 표현을 알고 있습니다. 모든 언어로 Java를 작성할 수도 있습니다.


14

아니, 비 파이썬입니다. 일반적으로 허용되는 방법은 일반 데이터 속성을 사용하고 더 복잡한 가져 오기 / 설정 논리가 필요한 속성을 속성으로 대체하는 것입니다.


13
+1 : "여기는 모두 성인입니다." 코드가 표시됩니다. "private"및 "getter / setter"는 모든 코드를 볼 수있을 때 어떤 값도 생성하지 않습니다.
S.Lott

7

귀하의 질문에 대한 짧은 대답은 아니오입니다. 필요할 때 속성을 사용해야합니다. Ryan Tamyoko는 그의 기사 Getters / Setters / Fuxors 에서 긴 답변을 제공합니다.

이 모든 것에서 벗어나야 할 기본 가치는 모든 코드 줄이 프로그래머에게 어떤 가치 나 의미를 갖도록 노력하는 것입니다. 프로그래밍 언어는 기계가 아니라 인간을위한 것입니다. 유용하지 않거나 읽기 어렵거나 지루해 보이는 코드가 있다면 Python에 제거 할 수있는 언어 기능이있을 가능성이 높습니다.


5

당신의 관찰은 정확합니다. 이것은 일반적인 파이썬 프로그래밍 스타일이 아닙니다. 속성은 모두 공용이므로 클래스 나 인스턴스뿐만 아니라 속성이있는 객체의 속성을 사용하는 것처럼 속성에 액세스 (가져 오기, 설정, 삭제)하면됩니다. Python 코드가 Python 구문을 사용하는 Java처럼 보이기 때문에 Java 프로그래머가 Python을 언제 배우는지 쉽게 알 수 있습니다!

나는 확실히 특히 필립의 유명한 기사 막시의 링크 @ 이전의 모든 포스터에 동의 하고 클래스와 인스턴스 속성을 설정 (그리고 점점)의 표준 방법보다 더 복잡 아무것도 (더 일반화 또는 기술자) 속성을 사용하는 것을 최대의 제안 @ 속성 가져 오기 및 설정을 사용자 정의합니다! (여기에는 개인, 보호, 친구 또는 공개 이외의 다른 것을 원하는 경우 원하는 정책의 사용자 정의 버전을 추가 할 수있는 기능이 포함됩니다.)

흥미로운 데모로 Core Python Programming (13 장, 섹션 13.16)에서 디스크립터를 사용하여 속성을 메모리 대신 디스크에 저장하는 예제를 생각해 냈습니다 !! 네, 영구 저장소의 이상한 형태는, 그러나 그것은 않습니다 당신에게 무엇이 가능한지의 예를 보여!

다음은 유용 할 수있는 또 다른 관련 게시물입니다. Python : 여러 속성, 하나의 setter / getter


0

나는 그 대답을 위해 여기에 왔습니다 (불행히도 나는 할 수 없었습니다). 하지만 난 발견 된 주변의 일을 다른 곳. 아래 코드는 get의 대안이 될 수 있습니다 .
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
이것은 해결 방법 일뿐 입니다. 위의 개념을 사용하면 py에서도 get / set 방법론을 쉽게 구축 할 수 있습니다.


-10

우리 선생님은 언제 접근 자 함수를 사용해야하는지 설명하는 수업 중 한 가지 예를 보여주었습니다.

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()

나는 당신에게 반대표를주지 않았지만, 나는 차임 할 것이라고 생각했다. 토론의 요점은 "파이썬에서 직접 속성에 접근하기 위해 왜 get () / set ()이 필요한가"이다. Java에는이를 바람직하게 만드는 언어 ... 기능이 있습니다. 파이썬에서는 그렇게 많지 않습니다.
Avery Payne

7
질문에 실제로 답변하지 않는 것 외에도이 답변에 사용 된 예는 모욕적입니다. 선생님이 그것을 사용했다는 주장은 성 차별을 정당화하지 않습니다.
Touzen 2015

나는 이것이 단지 당신의 순진함을 보여주는 성 차별을 보여주지 않을 것입니다. 할머니 세대에서 많은 여성들이 나이가 실제보다 몇 살 더 어리다고 농담을했습니다. 게다가 그것은 어쨌든 대답과 관련이 없습니다.
Johan Snowgoose
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.