2011-01-02 3 views
0

이렇게 간단한 클래스를 만들면 :함수 표기법을 사용하지 않고 새 객체를 인스턴스화 할 수 있습니까? 왜?

class Foo: 
    i = 1 
    j = 2 

Foo()를 사용하는 것과는 반대로 Foo를 오른쪽에서 간단히 사용하여 새 오브젝트를 인스턴스화 할 수 있습니까? 나는 추측하지만, 다음과 같이 시도해 보았다.

finst = Foo 
print finst.i 
+1

속성 - 당신이 혼란에 대처하지 않는 구식 수업입니다. (또는 파이썬 3으로 바꾸면, 다른 것들 중에서도 수정되었습니다.) – delnan

답변

4

아니요 새 인스턴스를 만드는 중입니다.

시도 :

class Foo: 
    def bar(self): 
    print 42 

finst = Foo 
finst.bar() 
finst 단지 클래스 Foo의 별칭이며, ij는 클래스 변수가 아닌 인스턴스 변수이기 때문이다

Traceback (most recent call last):
File "", line 1, in
TypeError: unbound method bar() must be called with Foo instance as first argument (got nothing instead)

1

개체를 인스턴스화하지 않았습니다. 방금 클래스 범위에서 변수를 정의하고 액세스했습니다. i은 개체 (또는 인스턴스)의 속성이 아니기 때문에 작동합니다. 클래스의 속성입니다.

1

. 인스턴스 변수로 선언했다면 :

class Foo: 
    def __init__(self): 
     self.i = 1 
     self.j = 2 

그러면 코드가 오류를 일으킬 수 있습니다.

질문에 대답하려면 아니오, 인스턴스를 생성하기 위해 생성자를 호출해야합니다. 그 자체로

+0

'self.i'와'self.j' 레퍼런스는 인스턴스 메소드 ('self'가 전달 된 함수) 아래에 있어야합니다. 그렇지 않으면 'self is not defined'오류가 발생합니다. –

+0

@ 트라이 예, 나는 그저 나 자신도 잡았습니다. 좋은 캐치. –

1

Fooclass Foo의 클래스 객체입니다

>>> type(Foo) 
<type 'classobj'> 
>>> type(Foo()) 
<type 'instance'> 

귀하의 코드 :

  1. 바인드 이름 Foo 클래스 객체에 대한 finst :

    finst = Foo 
    print finst.i 
    

    같이 디코딩.

  2. 인쇄 클래스 '의 값은 또한 당신이 이제까지 (직접 또는 간접적으로) object``에서 상속해야 정의 모든 단일 클래스를 참고 i
관련 문제