2016-10-01 1 views
1

필자는 Python 클래스 내의 메소드가 항상인데, self 인수가 필요하다는 인상을 받았다. 실제로는 실제로는 self 일 필요는 없다. 그러나 내가 쓴이 수업은 필요하지 않습니다.왜이 방법에서는`self`가 사용되지 않습니까?

import ZipFile 
import os 
class Zipper: 
    def make_archive(dir_to_zip): 
     zf = zipfile.ZipFile(dir_to_zip + '.zip', 'w') 
     for filename in files: 
      zf.write(os.path.join(dirname, filename)) 
     zf.close() 

참조 하시겠습니까? No self. make_archiveself 인수를 포함하면 TypeError: make_archive() missing one positional argument 오류가 발생합니다. 이런 일이 왜 알아 내 검색에서, 나는 실제로 복사하여 워드 프로세서에서 유사한 프로그램을 실행하려고 :

class MyClass: 
    """A simple example class""" 
    i = 12345 

    def f(self): 
     return 'hello world' 

print(MyClass.f()) # I added this statement to have a call line 

와 나는 같은 오류가 발생합니다! Zipper() 클래스를 포함하는 동일한 모듈에서

TypeError: f() missing 1 required positional argument: 'self' 

, 나는 모든 self의 사용을 여러 클래스가 있습니다. 여기서 이론을 이해하지 못하기 때문에 어떤 것을해야하는지 알기가 어렵습니다. 특히 문서를 직접 복사했을 때 ( this is the docs page) 실행하지 못했기 때문에 더욱 그렇습니다. 데비안 리눅스에서 파이썬 3.5와 3.4를 사용하고 있습니다. 내가 생각할 수있는 유일한 방법은 정적 메서드라는 것입니다. make_archive 메서드 위에 @staticmethod을 포함 시키면 위에 서술 된대로 Zipper.make_archive()이 제대로 작동하지만 확실한 설명은 찾을 수 없습니다.

+1

"여기서는 이론을 이해하지 못합니다. 특히 문서를 직접 복사 한 문서 (문서 페이지 임)가 실행될 때 오류가 발생하는 것을 알기가 어렵습니다." 실패한 부분은 문서에서 복사 한 부분이 아닙니다. 이 섹션의 * 다음번 코드 스 니펫은 클래스의 "인스턴스화"를 보여줍니다. 다음 섹션에서는 인스턴스의 속성 (메소드 포함)에 대해 다룹니다. 코드를 테스트하는 것뿐만 아니라 코드 스 니펫 사이에있는 텍스트를 읽고 이해하는 ** 필요합니다. –

+0

또한 전문 용어가 사용되었습니다.문서에서 나온 언어를 스스로 가르치려고한다면 울퉁불퉁 한 타고있을 수 있다고 경고하십시오. 어쨌든, 이것에 더 조심하십시오; 프로그래밍은 정밀도를 요구합니다. StackOverflow는 사람들이 언어의 기초를 배우는 데 도움이되는 곳이 아니며 "프로그래밍 방법"이 아닙니다. 그것은 당신의 일에 일어나는 특정한 기술적 인 문제를 해결하기위한 것입니다. –

+1

StackOverflow는 "귀하의 작업에서 발생하는 특정 기술 문제"에 대한 것입니다. 나는 개인적으로이 문제를 내 연구에서 제기 된 기술적 인 문제로 생각할 것인데, 나는 "왜 이것이 자기 자신을 요구하지 않는가? 내가 문제를 발견했을 때 나는 개인 프로젝트를 진행하고 있었다. 나는이 질문을하기 전에 상당한 연구를했다. 이것이 필요한 것이다. 내 용어에 대해 무슨 뜻인지 모르겠지만 경고를 주셔서 감사합니다. 오전 2시 30 분에 프로그래밍 질문을 할 수있는 좋은 곳이 있다면, 여기에오고 싶습니다. –

답변

0

정적 메서드로 사용하려고합니다. 당신의보기에서;

class MyClass: 
    """A simple example class""" 
    i = 12345 

    def f(self): 
     return 'hello world' 

a = MyClass() 
a.f() # This should work. 

MyClass.f()fMyClass에 대한 정적 가정 호출. self

class MyClass: 
    @staticmethod 
    def f(): # No self here 
     return 'hello world' 

MyClass.f() 
0

것은 그것이 암시 적으로을 추가되는 것입니다 : 당신은 정적으로 만들 수 있습니다. 즉, 호출 코드는 Myclass().f()이지만 호출 수신자는 Myclass().f(self)입니다. 또한이 메소드가 Myclass의 인스턴스에서 호출되어 self 변수에 배치된다는 것을 의미합니다. 요점은 아마도 메소드가 인스턴스 데이터를 사용하거나 수정할 수 있다는 것입니다 (그렇지 않은 이유는 해당 클래스에 있을까요?). 문제의 인스턴스를 자동으로 제공하는 것이 편리합니다.

인스턴스 데이터가 필요하지 않은 경우 개체 메서드보다 실제로는 더 비슷하면 @staticmethod을 사용하고, 다른 클래스에서 다르게 사용되는 경우 메서드를 @classmethod으로 사용해야합니다. staticmethods에 대한 간단한 소개는 @ pankaj-daga 대답을 참조하십시오.

구문은 from Foo import bar 대신 import Foo을 통해 가져온 함수에서도 사용됩니다. 이는 또한 혼동의 원인 일 수 있습니다. 그것은 당신의 목적에 따라 완전히 다른 것입니다.

관련 문제