2016-07-02 4 views
2

파이썬에서 클래스 내에서 ClassName.class_var 또는 self.class_var 중 하나를 사용하여 클래스 수준 변수를 참조 할 수 있습니다. 이제는 같은 이름의 인스턴스 변수를 생성하여 객체 내의 클래스 수준 변수 이름을 재정의하지 않는 한 (바보 같은 일이 될 수 있음) 항상 동일한 것을 참조하게됩니다.파이썬에서 클래스 변수를 어떻게 참조해야합니까?

제 질문은 더 좋은 습관입니까? 또는 더 일반적인?

어느 쪽이든을 사용하여 코딩 서적과 소스 코드 자체를 볼 수 있습니다. 어떤 경우에는 두 클래스 모두 동일한 클래스 내의 변수를 참조하는 방법을 사용하여 실제로 일관성이없는 것으로 생각합니다. 당신은 단지 하나 개의 클래스가 있고 단지 변수를 읽는다면

class Foo(object) : 
    class_var = ['same','for','all'] 
    def __init__(self, instance_var) : 
     self.instance_var = instance_var 
    def print_words(self) : 
     # here I could use self.class_var 
     for w in Foo.class_var : 
      print w 

답변

4

, 당신은 많은 차이를 볼 수 없습니다 :

여기에 내가 예를 제공합니다. Foo.class_var가 특정 값을 구체적으로 언급하는 것 동안

당신의 계정에 class_var를 오버라이드 (override)하는 서브 클래스의 가능성을 경우, self.class_var 먼저 현재 클래스에서 찾게됩니다. 가장 좋은 방법은 의도에 따라 다르지만 선택 사항이되는 언어로 클래스를 사용하면 다형성에 대한 관심이 적어도 있음을 의미하기 때문에 self이 더 일반적입니다.

또한 값을 설정하려면 self.whatever =이 인스턴스 변수를 설정하고 Foo.whatever =은 다른 인스턴스에도 영향을 줄 수있는 클래스 변수를 설정합니다.

0

예제에서 Foo.class_var을 사용하는 데 따른 문제점은 상속에 있습니다.

class Bar(Foo): 
    class_var = ['other','one','here'] 

In [2]: a = Foo(['one']) 

In [3]: b = Bar(['one']) 

In [4]: a.class_var 
Out[4]: ['same', 'for', 'all'] 

In [5]: b.class_var 
Out[5]: ['other', 'one', 'here'] 

In [6]: b.print_words() 
same 
for 
all 

그것은이 원하는 동작입니다 가능하지만, 나는 그것이 흔히 생각 : 당신은 당신의 푸() 클래스로 시작, 그것은 여기에 설명 볼 수 있습니다. 일반적으로 다양한 종류의 self을 사용하게됩니다.

관련 문제