2014-09-07 1 views
0
class exampleclass:  
    def meth01(self, name):   
     print self.name 

obj1 = exampleclass() 
obj1.meth01("James") 

오류 메시지 :파이썬 오류

Traceback (most recent call last): File "<pyshell#5>", line 1, in 
<module> 
    obj1.meth01("James") File "<pyshell#3>", line 3, in meth01 
    print self.name AttributeError: exampleclass instance has no attribute 'name' 

그래서 난이 오류가 발생하는 것은 잘못 한 일을, 이름이 매개 변수에 그리고 나는 그것을 인쇄 할 수 있도록 무엇인지 이름을 설정하려고 ?

+1

먼저 'self.name'을 설정해야합니다. – hjpotter92

+0

@ 카스라 질문에 "제발"과 "감사"등을 추가하지 마십시오. – hjpotter92

+0

@ hjpotter92 이유가 무엇입니까? 분명히 name이 매개 변수에 있고 아직 정의되지 않았기 때문에 객체를 만들 때 name을 정의 할 수 있습니까? 나는 self.name = name을 쓰는 목적을 알아 내기 위해 글을 쓰려고한다. – Grey

답변

2

self.name을 인쇄하고 있습니다. 이것은 클래스의 멤버 변수이며 함수 meth01의 입력 변수가 아닙니다. 함수에서 name은 입력을 나타내고 self.name은 클래스의 멤버 변수를 참조합니다. 그러나 당신은 그것을 설정하지 않습니다.

대신이 작업을 수행 :

class ExampleClass: 
    def setName(self, name): 
     self.name = name 
    def meth01(self, name): 
     print('Input variable name: ', name) 
     print('Member variable name: ', self.name) 

ec = ExampleClass() 
ec.meth01('John') # This line will fail because ec.name hasn't been set yet. 
ec.setName('Jane') 
ec.meth01('John') 
# This will print: 
#('Input variable name: ', 'John') 
#('Member variable name: ', 'Jane') 
+0

@Unapidra, 클래스의 멤버 변수는 무엇입니까? 그게 무슨 뜻인지 설명해 주시겠습니까? 나는 사람들이 왜 쓰는지 이해하려고 노력하고있다. self.name = name? 그것은 의미가 없습니다. self는 무엇입니까? 그것은 도트 때문에 메서드로 보이지만 그렇지 않습니다. 왜 우리는 그것을 이름 안에 넣어야합니까?매개 변수에있는 것과 동일한 "이름"입니까? 나는 머리가 폭발하려고합니다. – Grey

+0

@Grey, 당신은 객체 지향 프로그래밍에 익숙합니까? 멤버 변수는 클래스에 속하는 변수입니다. 파이썬 멤버 변수와 함수/메소드는 점으로 표시됩니다. 괄호가 없으므로 변수입니다. – Unapiedra

+1

'name'과'self.name'은 완전히 다른 두 가지입니다! 'def meth01 (self, not_a_name) : self.name = not_a_name' – Unapiedra

1

을 당신은 당신의 __init__ 방법

class exampleclass: 
    def __init__(self, name): 
     self.name = name 
1

변수를 만들 필요가 :

class ExampleClass: 
    def meth01(self, name): 
     print(name) 

이처럼 확장, 무슨 일이 일어나고 있는지 이해하기 name은 매개 변수 목록에 포함되어 있지만은 없습니다.예제 클래스 객체 자체의 멤버 값입니다 (아직).

단계별로 코드의 기능을 생각해보십시오. 먼저 새로운 exampleclass 객체를 인스턴스화합니다.

그런 다음 obj1.meth01("James")으로 전화하십시오. meth01은 값 자체 =으로 obj1와 이름 = "제임스"와 함께 전달

meth01 다음 obj1.name로 저장된 값을 찾으려고하지만,이 경우 name이 방법 meth01에 로컬 및의 일부가 아니므로 어느 것도 존재하지 않습니다 객체 obj01 그 자체.

1

개체를 초기화하는 데 사용되는 constructor을 만들어야합니다.

__init__ 방법을 이렇게 만드십시오.

class exampleclass: 
    def __init__(self, name): 
     self.name = name 

참고 : 생성자는 언급 된대로 선언하십시오.

이 같은 self을 이해할 수 :

자기 생성자 또는 메서드가 호출되는 객체의 주소를 저장한다. 그래서 self.name = name은 호출 된 개체의 데이터 멤버를 생성자에 매개 변수로 전달 된 변수 name에 할당하게됩니다.