이렇게 간단한 클래스를 만들면 :함수 표기법을 사용하지 않고 새 객체를 인스턴스화 할 수 있습니까? 왜?
class Foo:
i = 1
j = 2
Foo()를 사용하는 것과는 반대로 Foo를 오른쪽에서 간단히 사용하여 새 오브젝트를 인스턴스화 할 수 있습니까? 나는 추측하지만, 다음과 같이 시도해 보았다.
finst = Foo
print finst.i
이렇게 간단한 클래스를 만들면 :함수 표기법을 사용하지 않고 새 객체를 인스턴스화 할 수 있습니까? 왜?
class Foo:
i = 1
j = 2
Foo()를 사용하는 것과는 반대로 Foo를 오른쪽에서 간단히 사용하여 새 오브젝트를 인스턴스화 할 수 있습니까? 나는 추측하지만, 다음과 같이 시도해 보았다.
finst = Foo
print finst.i
아니요 새 인스턴스를 만드는 중입니다.
시도 :
class Foo:
def bar(self):
print 42
finst = Foo
finst.bar()
finst
단지 클래스
Foo
의 별칭이며,
i
및
j
는 클래스 변수가 아닌 인스턴스 변수이기 때문이다
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)
개체를 인스턴스화하지 않았습니다. 방금 클래스 범위에서 변수를 정의하고 액세스했습니다. i
은 개체 (또는 인스턴스)의 속성이 아니기 때문에 작동합니다. 클래스의 속성입니다.
. 인스턴스 변수로 선언했다면 :
class Foo:
def __init__(self):
self.i = 1
self.j = 2
그러면 코드가 오류를 일으킬 수 있습니다.
질문에 대답하려면 아니오, 인스턴스를 생성하기 위해 생성자를 호출해야합니다. 그 자체로
'self.i'와'self.j' 레퍼런스는 인스턴스 메소드 ('self'가 전달 된 함수) 아래에 있어야합니다. 그렇지 않으면 'self is not defined'오류가 발생합니다. –
@ 트라이 예, 나는 그저 나 자신도 잡았습니다. 좋은 캐치. –
Foo
는 class Foo
의 클래스 객체입니다
>>> type(Foo)
<type 'classobj'>
>>> type(Foo())
<type 'instance'>
귀하의 코드 :
Foo
클래스 객체에 대한 finst
: finst = Foo
print finst.i
같이 디코딩.
i
속성 - 당신이 혼란에 대처하지 않는 구식 수업입니다. (또는 파이썬 3으로 바꾸면, 다른 것들 중에서도 수정되었습니다.) – delnan