2014-06-09 4 views
0

아래 장난감 예제에서 두 클래스는 동일한 클래스를 만듭니다 (하나는 Foo.spam()을 사용하고 다른 하나는 값을 얻기 위해 Foo.spam을 사용함). 내 질문은, 다른 하나를 선택하는 기준은 무엇입니까? spam에 자주 액세스해야하는 경우 함수 오버 헤드로 인해 두 번째 클래스 구현을 사용하는 것이 좋습니다. 다른 건 없니?사용할 클래스 변수 대 classmethod?

class Foo(object): 
    def __init__(self, a): 
     self.a = "init" 
    @classmethod 
    def spam(cls, value=2): 
     return value + 1 
Foo.spam() # -> 3 
Foo.spam(3) #-> 4 

class Foo(object): 
    spam = 3 
    def __init__(self, a): 
     self.a = "init" 
Foo.spam #-> 3 
Foo.spam = 4 
Foo.spam #-> 4 
+0

더 명확한 유스 케이스를 제공 할 수 있습니까? 어느 예제도 당신이 달성하기를 원하는 것에 대한 명확한 아이디어를 제공하지 못합니다. 특히, 예제는 당신이'3'을 통과 한 후에 미래의 접근에 대해 매우 다른 행동을합니다. – user2357112

+0

관련 항목 : http://stackoverflow.com/questions/2579840/do-you-use-the-get-set-pattern –

답변

3

나는 (클래스 속성에 기본값을 할당하는) 달성하려는 대상이 파이썬 적으로 정확하지 않다고 생각합니다. 왜이 일을 단순히하지 않겠습니까?

class Foo(object): 
    def __init__(self, a = 'init'): 
     self.a = a 
     self.spam = 2 

: 그리고 정적 클래스 속성 (두 번째 예)를 통해 그것을 할 경우

>>> a_foo = Foo() 
>>> a_foo.spam 
2 
>>> a_foo.spam = 3 
>>> a_foo.spam 
3 

, 당신은 당신이/액세스 권한을 할당하는 방법에 따라 매우 다른 동작을 얻을 수 그것을 :

다음
class Foo(object): 
    spam = 2 
    def __init__(self, a = 'init'): 
     self.a = a 

과 :

>>> a_foo1 = Foo() 
>>> a_foo2 = Foo() 
>>> a_foo1.spam 
2 
>>> a_foo2.spam 
2 
>>> Foo.spam = 3 
>>> a_foo1.spam 
3 
>>> a_foo2.spam 
3 

# But now they'll diverge 
>>> a_foo1.spam = 5 
>>> a_foo1.spam 
5 
>>> a_foo2.spam 
3 
>>> Foo.spam = 2 
>>> a_foo1.spam 
5 
>>> a_foo2.spam 
2 

당신은 spam 수정 spam의 모든인스턴스의 사본의 인스턴스의 사본을 수정하면, 당신은 이런 종류의 비록 정적 속성

class Foo(object): 
    _spam = 2 
    def __init__(self, a = 'init'): 
     self.a = a 

    @property 
    def spam(self): 
     return Foo._spam 

    @spam.setter 
    def spam(self, value) 
     Foo._spam = value 

>>> a_foo1 = Foo() 
>>> a_foo2 = Foo() 
>>> a_foo1.spam 
2 
>>> a_foo2.spam 
2 
>>> a_foo1.spam = 3 
>>> a_foo2.spam 
3 

와 결합 된 속성을 사용 거라고 있도록 만들려고 노력하는 경우 singleton-attribute 동작은 다소 위험하며 클래스의 대부분 사용자는 모든 인스턴스의 속성을 수정하기 위해 하나의 인스턴스의 속성을 수정하려고하지 않으므로 일부 사람들은 반 패턴으로 간주 될 수 있습니다. 이런 식으로하는 이유는 분명히 있습니다.

2

메서드가 아무 것도 수행하지 않고 특성 값만 반환하면 해당 특성을 사용하면됩니다.

그러나 원하는 값을 전달하기 때문에 예제가 이중으로 이상합니다. 3 번만 원할 경우 Foo.spam(3)또는Foo.spam = 3을 사용할 필요가 없습니다. 숫자 3을 사용하십시오.