효과

2013-10-12 2 views
-2

어떻게 첫 번째 예에서 __str__ 방법은 self.foo가 정의되지 않은 성공적으로 문자열을 반환한다는 것입니다 :효과

class foo: 
    foo = 'K-Dawg' 

    def __str__(self): 
     return self.foo 

obj = foo() 
print obj 
#K-Dawg 

을 그리고 클래스 생성자 메서드를 만들 때 __init__는이 생성됩니다

AttributeError: foo instance has no attribute 'foo'

class foo: 
    def __init__(self): 
     foo = 'K-Dawg' 

    def __str__(self): 
     return self.foo 

obj = foo() 
print obj 

self.foo이 첫 번째 예에서는 성공적으로 반환되고 두 번째 예에서는 성공적으로 반환되지 않는 이유는 무엇입니까?

클래스 생성자는 속성에 어떤 영향을 미칩니 까?

편집 : 첫 번째 예제의 속성 foo 사용 호출 할 얻을 수 있다는 이유 나는 foo = 'K-Dawg'self.foo = 'K-Dawg'에 변경하면 성공적으로 K-개같은를 인쇄 할 것이라는 점을 알고있다, 그러나 내가 부탁 해요 것은 않습니다 self.foo

+0

'__init__'은 (는) 사이드 노트에 단지 생성자가 아닙니다. – Hyperboreus

답변

6

수정 된 첫 번째 프로그램 난 그냥 몇 가지 인쇄 문을 포함

class foo: 
    def __init__(self): 
     print locals() 
     foo = 'K-Dawg' 
     print locals() 

    def __str__(self): 
     print locals() 
     return self.foo 

obj = foo() 
print obj 

class foo: 
    foo = 'K-Dawg' 

    def __str__(self): 
     print dir(self) 
     return self.foo 

obj = foo() 
print obj 

수정 두 번째 프로그램. 각 프로그램의 결과물을 보면 정확히 무엇이 일어나고 있는지 파악할 수 있습니다.

첫 번째 프로그램은

['__doc__', '__module__', '__str__', 'foo'] 
K-Dawg 

우리는 foo이 객체가 이미 있음을 알 수 인쇄됩니다. 사실,이 경우 foo은 클래스 변수입니다 (클래스 인스턴스와 아무런 관련이 없습니다. C, C++ 또는 JAVA 배경 인 경우 Object가 아닌 클래스에 바인딩되는 정적 변수로 간주 될 수 있음).

두 번째 프로그램은

{'self': <__main__.foo instance at 0x7f528aa90488>} 
{'self': <__main__.foo instance at 0x7f528aa90488>, 'foo': 'K-Dawg'} 
{'self': <__main__.foo instance at 0x7f11f236d488>} 
AttributeError: foo instance has no attribute 'foo' 

그것은 분명 변수 foo__init__ 기능에 생성되었다 있음을 보여주고 있지만 __str__에 도달 할 때 사용할 수없는 인쇄됩니다. __init__에 작성된 foo 변수가 해당 기능에 국한된다는 의미입니다.당신이 객체의 변수를 만들고 싶었 경우

, 당신은 클래스의 현재 인스턴스에이

class foo: 
    def __init__(self): 
     print locals() 
     self.foo = 'K-Dawg' # Note the self keyword at the beginning 
     print locals() 

    def __str__(self): 
     print locals() 
     return self.foo 

obj = foo() 
print obj 

출력처럼

{'self': <__main__.foo instance at 0x7fe0e2da24d0>} 
{'self': <__main__.foo instance at 0x7fe0e2da24d0>} 
{'self': <__main__.foo instance at 0x7fe0e2da24d0>} 
K-Dawg 

self 점을 무언가를해야하고 우리는 self.foo = 'K-Dawg'을 수행하여 foo이라는 변수를 첨부합니다. 그것이 이것이 효과가있는 이유입니다.

2

첫 번째 예에서는 클래스 속성 인 foo (클래스의 모든 인스턴스간에 하나의 속성이 공유 됨)을 만들었습니다. self.foo에 액세스하려고 시도 할 때 인스턴스에 자체 foo 특성이 없으면 클래스에서 인스턴스를 읽습니다.

두 번째 경우에는 특성을 전혀 작성하지 않습니다. foo (__init__)은 지역 변수입니다. 당신이 인스턴스 변수를 만들려면 다음이 필요합니다

def __init__(self): 
    self.foo = 'K-Dawg'