2010-12-30 1 views
4

파이썬에서는 클래스 전체에 속성을 선언 할 수 있습니다. 예 :Python - 클래스에서 속성을 선언하는 관례는 무엇입니까?

많은 특성을 가진 큰 클래스가있을 때 클래스의 모든 특성을 검색하기가 어렵습니다.

A) 여기, 모든 속성을 찾을 어려운 :

class Foo: 
    def __init__(self): 
     foo_1() 
     foo_2() 

    def foo_1(self): 
     self.a = 0 
     self.b = 0 

    def foo_2(self): 
     self.c = 0 

B

은 더 나은 (a) 또는 다음 다음 코드 (b)는 다음과 같은 코드를 가지고있다) 여기에서 모든 속성을 쉽게 찾을 수 있지만 멋집니까? 간단히 말해서

class Foo: 
    def __init__(self): 
     (self.a, self.b) = foo_1() 
     self.c = foo_2() 

    def foo_1(self): 
     a = 0 
     b = 0 
     return (a, b) 

    def foo_2(self): 
     c = 0 
     return c 

, 당신의 규칙은 클래스에 속성을 선언하는 무엇인가?

편집 : 물론

, 그것은 간단한 예제 여기에 내 코드를 개선 할 필요가 없습니다. _ init_()에서 호출되는 많은 "작은 메소드"(가독성을 높이기 위해 코드를 나눌 수있는)가있는 복잡한 클래스를 상상해보십시오.

+4

... 위의 어느 쪽이라고도 말할 수 있습니까? 나는 단지 이것이 문제가되기에 충분한만큼 수업을 성장시키지 않는다. –

+0

안녕하세요, "위의 두 가지"? 가능한가? 어떻게 지내니? :-) –

+0

"그럼 어떻게하니?" 쉬운. 이것이 문제가되기에 충분한 규모로 성장시키지 마십시오. 수업 시간을 줄입니다. 사물을 별도의 클래스로 만듭니다. 단순화하십시오. 초점. –

답변

4

이 문제의 새로운 기능 :

class Foo: 
    def __init__(self): 
     self.a = 0 
     self.b = 1 
     self.c = 2 

또는 a, bc가 어떤 식 으로든 관련이 있다면, 당신은 한 줄에 선언 할 수 있습니다

class Foo: 
    def __init__(self): 
     self.a, self.b, self.c = 0, 1, 2 

또는 경우 a, bc 어떤 식 으로든 관련이 있습니다 당신은 동일한 불변 값으로 초기화하고 있습니다, 당신은 그들을 선언 할 수 있습니다 나는 단일 할당 :

class Foo: 
    def __init__(self): 
     self.a = self.b = self.c = 0 
+0

동의. (Nitpicking :이 특별한 예제에서는'self.a = self.b = self.c = 0'을 할 수있다 - 할당은 표현식이 아니지만이 특별한 경우는 허용된다. 물론 이것은 거의 유용하지 않고 다른 의미를 갖는다. 변경 가능한 객체를 할당 할 때). – delnan

+0

내 방법 \ __ init \ __에서 많은 일을해야한다면 \ init __을 여러 작은 방법으로 나누는 것을 선호합니다. 이 경우, \ ​​__init \ __ (a)에서 속성 만 선언하는 것이 더 낫습니다. (b)를 참조하십시오) –

+0

@SeyZ : 큰 메소드를 싫어하는만큼 init이 큰, 귀하의 클래스는 propably 대형 자체입니다 (단일 책임 원리 참조). 우리는 얼마나 큰 소리 죠? 몇 가지 초기화를 구조화하려면 빈 줄을 사이에 넣고 전체 단락에 대해서는 주석을 넣으십시오. – delnan

0

우선, 여기에서는 클래스 속성에 대한 것이 아니라 인스턴스 속성에 대해 설명합니다. 그것에 대한 나의 관례는 다른 메소드에서 초기화 된 경우 없음의 값을 사용하여 생성자에서 모든 것을하는 것입니다. 그렇게하면 언제나 무엇을 기대할 수 있는지 알 수 있습니다. 의무 사항은 아니지만 선언하는 것과 같습니다.

는 예컨대 : 글쎄, 나는 또한 키워드 인수로 inititializers을 좋아

class Foo(object): 
    def __init__(self, a=None, b=None, c=None): 
     self.a = a 
     self.b = b 
     self.c = c 

, 그것은 더 유연합니다. 그렇게 기본 설정을 쉽게 무시할 수 있습니다.

0

파이썬에서는 모든 클래스에 특성 을 선언 할 수 있습니다.

수정.

내가 속성이 많은 큰 클래스가있을 때 내 클래스의 모든 속성을 검색하기는 어렵습니다.

아니요. dir(object) 또는 obj.__dict__이 도움이됩니다. 게다가, 왜 모든 속성을 검색하고 싶습니까?

여기서, 모든 당신이 정의를 찾을 수 있습니다

좋은 편집기/IDE를 속성을 찾을 수 어렵습니다. 나는 이것을 위해 WingIDE를 사용한다. 꽤 좋다.

여기에 모두 속성을 쉽게 찾을 수 있지만 정말 아름답습니까?

음,이 특정 코드는, 아마,하지만 __init__ 또는 클래스의 모든 공용 속성을 선언 (그러나이 작업을 수행 할 때 Jabberwock를 조심)하는 것은 매우 일반적입니다. 그런 식으로 당신은 그들이 사용할 수 있다는 것을 알 수 있습니다.