get / set을 사용하는 것은 (다양한 이유로) Java에서 일반적인 관행 인 것처럼 보이지만 이것을 사용하는 Python 코드는 거의 볼 수 없습니다.
Python에서 get / set 메서드를 사용하거나 피하는 이유는 무엇입니까?
get / set을 사용하는 것은 (다양한 이유로) Java에서 일반적인 관행 인 것처럼 보이지만 이것을 사용하는 Python 코드는 거의 볼 수 없습니다.
Python에서 get / set 메서드를 사용하거나 피하는 이유는 무엇입니까?
답변:
멋진 링크 : Python은 Java가 아닙니다. :)
Java에서는 공용 필드를 사용하면 나중에 getter 및 setter를 사용하도록 마음을 바꿀 기회가 없으므로 getter 및 setter를 사용해야합니다. 따라서 Java에서는 집안일을 앞지르는 것이 좋습니다. Python에서는 클래스의 클라이언트에 영향을주지 않고 일반 속성으로 시작하여 언제든지 마음을 바꿀 수 있기 때문에 이것은 어리석은 일입니다. 따라서 getter 및 setter를 작성하지 마십시오.
파이썬에서는 퍼블릭이기 때문에 속성에 직접 액세스 할 수 있습니다.
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
결정적으로 클라이언트 코드는 동일하게 유지됩니다.
Guido van Rossum 이 프로그래밍의 마스터 마인드 에서 그것에 대해 말하는 것입니다.
"언어와의 싸움"이란 무엇을 의미합니까?
귀도 : 그것은 보통 그들이 다른 언어로 잘 작동하는 습관을 계속하려고한다는 것을 의미합니다.
[...] 사람들은 모든 것을 클래스로 바꾸고 모든 접근을 접근 자 메서드로 바꿀
것입니다. 파이썬에서하는 것은 정말 현명한 일이 아닙니다.
디버그하기 더 어렵고 훨씬 느리게 실행되는 더 자세한 코드가 있습니다. "어떤 언어로든 FORTRAN을 작성할 수 있습니까?"라는 표현을 알고 있습니다. 모든 언어로 Java를 작성할 수도 있습니다.
귀하의 질문에 대한 짧은 대답은 아니오입니다. 필요할 때 속성을 사용해야합니다. Ryan Tamyoko는 그의 기사 Getters / Setters / Fuxors 에서 긴 답변을 제공합니다.
이 모든 것에서 벗어나야 할 기본 가치는 모든 코드 줄이 프로그래머에게 어떤 가치 나 의미를 갖도록 노력하는 것입니다. 프로그래밍 언어는 기계가 아니라 인간을위한 것입니다. 유용하지 않거나 읽기 어렵거나 지루해 보이는 코드가 있다면 Python에 제거 할 수있는 언어 기능이있을 가능성이 높습니다.
당신의 관찰은 정확합니다. 이것은 일반적인 파이썬 프로그래밍 스타일이 아닙니다. 속성은 모두 공용이므로 클래스 나 인스턴스뿐만 아니라 속성이있는 객체의 속성을 사용하는 것처럼 속성에 액세스 (가져 오기, 설정, 삭제)하면됩니다. Python 코드가 Python 구문을 사용하는 Java처럼 보이기 때문에 Java 프로그래머가 Python을 언제 배우는지 쉽게 알 수 있습니다!
나는 확실히 특히 필립의 유명한 기사 막시의 링크 @ 이전의 모든 포스터에 동의 하고 클래스와 인스턴스 속성을 설정 (그리고 점점)의 표준 방법보다 더 복잡 아무것도 (더 일반화 또는 기술자) 속성을 사용하는 것을 최대의 제안 @ 속성 가져 오기 및 설정을 사용자 정의합니다! (여기에는 개인, 보호, 친구 또는 공개 이외의 다른 것을 원하는 경우 원하는 정책의 사용자 정의 버전을 추가 할 수있는 기능이 포함됩니다.)
흥미로운 데모로 Core Python Programming (13 장, 섹션 13.16)에서 디스크립터를 사용하여 속성을 메모리 대신 디스크에 저장하는 예제를 생각해 냈습니다 !! 네, 영구 저장소의 이상한 형태는, 그러나 그것은 않습니다 당신에게 무엇이 가능한지의 예를 보여!
다음은 유용 할 수있는 또 다른 관련 게시물입니다. Python : 여러 속성, 하나의 setter / getter
나는 그 대답을 위해 여기에 왔습니다 (불행히도 나는 할 수 없었습니다). 하지만 난 발견 된 주변의 일을 다른 곳. 아래 코드는 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 방법론을 쉽게 구축 할 수 있습니다.
우리 선생님은 언제 접근 자 함수를 사용해야하는지 설명하는 수업 중 한 가지 예를 보여주었습니다.
class Woman(Human):
def getAge(self):
if self.age > 30:
return super().getAge() - 10
else:
return super().getAge()