2013-03-21 3 views
0

파이썬 클래스 속성과 인스턴스 속성에 대해 연구하면서 객체 메소드 외부에 객체 속성을 생성 할 수 없다는 사실을 알게되었습니다 (또는 클래스 메소드 일 수도 있음). 아래의 코드는 파이썬에서 "NameError"를 생성합니다.왜 개체 메서드 외부에서 개체 특성을 만들 수 없습니까?

class test(object): 
    def __init__(self): 
     self.lst = [] 
    self.str = 'xyz' 

왜 파이썬이 허용하지 않는가? 나는 언어 제작자의 결정에 의문을 품지는 않지만 이것에 대한 이유는 무엇인가. 마찬가지로 기술적으로 부정확하거나이 동작의 다른 단점이 있습니다.

답변

5

클래스를 정의하므로 외부 메서드를 가리키는 인스턴스가 없습니다. 은`자기 드롭 :

class test(object): 
    def __init__(self): 
     self.lst = [] 
    str = 'xyz' 

self 점을 예를 아닌 클래스. 인스턴스를 만들고 속성 (test().str = 'xyz') 또는에 직접 할당해야합니다 (self이 실제로 인스턴스를 참조 할 수있는 경우). 당신이 원하는 경우

+0

클래스가 호출되기 전에 또는 함수의 실수가 프로그램에 영향을주지 않는 함수와 달리 해당 클래스가 호출되기 전에 인터프리터에 의해 구문 분석된다는 의미입니까? – Alinwndrld

+0

@Alinwndrld : 인터프리터는 class 객체를 찾으면 클래스 객체를 생성합니다. 참조 할 클래스 본문에'print'를 추가하십시오. 클래스도 객체입니다. 당신은'test' 클래스를 넘겨 줄 수 있고, 그 안에 정의 된 속성을 참조 할 수 있습니다. 파이썬이 그렇게 할 수 있으려면 먼저 클래스 본문을 실행하여 클래스 객체를 생성해야합니다. –

0

self 파이썬에서 특별한 이름이 아닙니다, 당신은

class test(object): 
    def __init__(foo): 
     foo.lst = [] 

\ 사용할 수 있습니다. 클래스의 모든 메소드는 첫 번째 매개 변수로 명시 적으로 전달 된 인스턴스를 가져오고, 원하는대로 호출 할 수 있습니다. 메서드의 범위를 벗어나는 매개 변수에 액세스하려고하면 분명히 작동하지 않습니다.

관련 문제