2011-07-06 3 views
1

나는 오버로드라고하는 개념이라고 생각합니다. 지금은 getter 및 setter 메서드를 제공하는 클래스를 작성 중이며 디자인 문제에 붙어 있습니다."메서드 오버로드"파이썬

두 가지 방법 모두 단순히 값을 설정하거나 값을 반환하는 단일 라이너입니다.

 
def set_number(self, num): 

    self.count = num 

def get_number(self): 

    return self.count 

은 공간을 절약하고 클래스가 기본적으로 하나에 두 가지 방법을 결합하고 단지의 num 인수가 있는지 여부에 따라 실행해야하는 라인을 결정하게 뭔가를 수행하여 작은 "모양"하기 위해 더 좋을 것이다 제공 되었습니까?

아니면 그냥 명확성을 고집하고 분리하여 보관해야합니까? 어떤 사람들은이 모든 일선을 독립적으로 유지하는 것은 "공간 낭비"라고 느끼는 반면, 다른 사람들은 의견을 달리하고 분열시키는 것을 선호합니다.

하나 또는 둘 중 하나를 선택해야하는 이유는 무엇입니까?

+4

@ 속성을 사용하십시오. 그것은 당신을 위해 이것을 단순화하고 모든 손을 짜내는 것을 제거 할 것입니다. –

답변

10

파이썬에서는 getter와 setter를 전혀 사용하지 않는 것이 좋습니다. 대신 count 속성을 직접 참조하십시오 (예 : print instance.count 또는 instance.count = 5

다른 언어로 된 getter 및 setter의 요점은 Getters 또는 Setter에 논리를 추가해야하는 경우 캡슐화 및 향후 검증을위한 것입니다. 파이썬에서는 나중에 property을 사용하여 기존 API를 손상시키지 않고이를 수행 할 수 있습니다.

@property 
def number(self): 
    # do extra logic if necessary 
    return self.count 

속성은 세터를 가질 수 있습니다 - 참조 : http://docs.python.org/library/functions.html#property

파이썬은 자바 없습니다. =)

추가 보너스 독서 자료 :

+0

오, 멋지네요. 나중에이 작업을해야한다면 세터를 추가 할 수 있습니다. – MxyL

+0

tomayko 및 의견에 대한 기사를 읽으면 최상의 옵션이 아닌 몇 가지 이유가있는 것으로 보입니다. 그러나 동일한 옵션을 언급하고 있는지 확실하지 않습니다. – MxyL

+0

@ Keikoku : 구체적인 언급을 위해 신경을 써야합니까? 제가 본 모든 것은 매우 주관적인 성명서이거나, 기사를 제대로 읽지 못했기 때문이거나, 이후의 논평에서 무시되었습니다. – delnan

-1

내가 코드 readabilty 및 maintainabilty를 위해서 두 개의 별도의 방법으로 떠날 것이다.

2

일반적으로 파이썬에서는 명시적인 getter/setter 메서드를 사용하는 것이 매우 좋지 않습니다. 그냥 같은 것을 할 : 당신이 정말 논리가 필요한 경우

In [1]: class Foo(object): 
    ...:  def __init__(self): 
    ...:   self.num = 1 
    ...:   
    ...:   
In [2]: f = Foo() 
In [3]: f.num 
Out[3]: 1 
In [4]: f.num = 2 
In [5]: f.num 
Out[5]: 2 

, 당신은 properties를 사용하여 나중에 동일한 API를 보존 할 수 있습니다. 기능을 추가하면서 아래에서 동일한 인터페이스가 유지되는 방법에 유의하십시오. 그 용어는 여기에 적용되지 않습니다 - "오버로드"에 관한

In [8]: class Foo(object): 
    ...:  def __init__(self): 
    ...:   self._num = 1 
    ...:  @property 
    ...:  def num(self): 
    ...:   return self._num 
    ...:  @num.setter 
    ...:  def num(self, num): 
    ...:   if num < 0: 
    ...:    raise ValueError("Your Foo would be too small!") 
    ...:   self._num = num 
    ...:   
    ...:   
In [10]: f = Foo() 
In [11]: f.num 
Out[11]: 1 
In [12]: f.num = 2 
In [13]: f.num 
Out[13]: 2 
In [14]: f.num = -1 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

/home/Daenyth/<ipython console> in <module>() 

/home/Daenyth/<ipython console> in num(self, num) 

ValueError: Your Foo would be too small! 

. 이는 +, == 등과 같은 연산자의 동작을 변경하는 것으로, 객체의 메소드 정의를 변경합니다. 파이썬에서 오버로드를 수행 할 수 있습니다. __cmp__, __add__, and so on.

+0

"우선합니다". 오버로딩은 같은 이름이지만 서명이 다른 두 개의 메소드를 의미합니다. 파이썬에서는 실제로 할 수 없습니다. – FogleBird

+0

@FogleBird; 너 괜찮아. 나는 그것을 섞었다. 그래도 '__cmp__'등을 통해 오버로드를 할 수 있습니다. – Daenyth

+0

@FogleBird : 물론,'(* args, ** kwargs)'를 사용할 수 있기 때문에 필요 없습니다. 전달 된 매개 변수의 수/개수에 따라 다르게 동작합니다. – geoffspear