2013-09-08 2 views
14

방금 ​​파이썬으로 프로그래밍을 시작 했으므로 '자기'의 모든 추론을 이해하지 못합니다. 데이터가 클래스의 다른 메소드간에 전달 될 수 있도록 전역 변수와 거의 같은 것으로 사용된다는 것을 알고 있습니다. 같은 클래스에서 다른 메서드를 호출 할 때 왜 사용해야하는지 이해할 수 없습니다. 내가 이미 그 반에 속해 있다면, 왜 그걸 말해야 만합니까 ??'self'가없는 파이썬 호출 방법

예 : 가지고있는 경우 : 왜 self.thing()이 필요합니까?

class bla: 
    def hello(self): 
     self.thing() 

    def thing(self): 
     print "hello" 
+4

파이썬 인터프리터를 열고'import this'를 실행하여 대부분의 파이썬 언어 결정에 대한 설명을하십시오. –

+1

@ColinValliant : "* 지금은 결코 우월하지 못하다."* "는 계몽 된 Pythoness에 의해서만 해석 될 수 있으며 질문에 대답하는 데 정말로 도움이되지 않습니다. – mins

답변

9

이유 중 하나는 코드가 실행되는 내에서 그 특정 클래스의 인스턴스의 메소드를 참조하는 것입니다.

이 예는 도움이 될 수 있습니다 :

def hello(): 
    print "global hello" 

class bla: 
    def hello(self): 
     self.thing() 
     hello() 

    def thing(self): 
     print "hello" 

b = bla() 
b.hello() 
>>> hello 
global hello 

당신은 지금, 그것을 생각할 수있는 공간 해상도로.

0

클래스 외부에 같은 이름의 다른 함수가있을 수 있습니다. self은 개체 자체에 대한 개체 참조이므로 동일합니다. 파이썬 메소드는 객체 자체의 컨텍스트에서 호출되지 않습니다. 파이썬에서 self은 커스텀 객체 모델 등을 다루는 데 사용될 수 있습니다.

1

당신이 def thing(args) 전역 함수로, 또는 다른 클래스의 방법으로이 (끔찍한) 예를 취할 수 있기 때문에 짧은 대답이 ":..

def thing(args): 
    print "Please don't do this." 

class foo: 
    def thing(self,args): 
     print "No, really. Don't ever do this." 

class bar: 
    def thing(self,args): 
     print "This is completely unrelated." 

이것은 나쁜이 작업을 수행하지 마십시오. . 당신이 따라 계획 경우했다 경우에, 당신은이 일어날 것 thing(args)뭔가를 부를 수있는이 잠재적으로 좋은 일이 될 수 있습니다

class Person: 
    def bio(self): 
     print "I'm a person!" 

class Student(Person): 
    def bio(self): 
     Person.bio(self) 
     print "I'm studying %s" % self.major 

T 위 코드를 작성하면 Student 클래스의 객체를 만들고 bio을 호출하면 Person 클래스 인 경우 bio이고이라고하는 클래스가있는 경우 발생하는 모든 작업이 수행됩니다. 그 후 자신의 물건.

이것은 상속과 아직 보지 못한 몇 가지 사항에 들어 있지만 앞으로 기대됩니다.

11

또한 static 클래스의 메소드를 만들 수 있으므로 self은 필요하지 않습니다. 그러나 정말로 필요하다면 이것을 사용하십시오.

너의 :

class bla: 
    def hello(self): 
     self.thing() 

    def thing(self): 
     print "hello" 

정적 판 : 나

class bla: 
    @staticmethod 
    def hello(): 
     bla.thing() 

    @staticmethod 
    def thing(): 
     print "hello" 
+1

이 글은 오래된 글이지만, 정적 메소드를 사용하는 시나리오의 예를 들어 주시겠습니까? – uitty400

0

가 self.foo() 및 self.bar와 범위 디파 등 자체의 기능으로 정의 된 파라미터를 나타내는 클래스가 아니라 다른 장소에서 정의됩니다.