2009-03-23 3 views
3

좋아, 그래서 내가 어떤 소스에서 살펴 본다 된 나는이 가로 질러 왔을 때 :파이썬, __init__과 자기 혼란

>>> def __parse(self, filename): 
...   "parse ID3v1.0 tags from MP3 file" 
...   self.clear() 
...   try: 
...    fsock = open(filename, "rb", 0) 
...    try: 
...     fsock.seek(-128, 2) 
...     tagdata = fsock.read(128) 
...    finally: 
...     fsock.close() 
...    if tagdata[:3] == 'TAG': 
...     for tag, (start, end, parseFunc) in self.tagDataMap.items(): 
...      self[tag] = parseFunc(tagdata[start:end]) 
...   except IOError: 
...    pass 
... 

그래서, 나는 그것을 테스트하기로 결정했다.

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __parse() takes exactly 2 arguments (1 given) 

이것은, 내가 인수 매개 변수 목록에서 자신을 포함하는 의미있어 계속 생각 나는이 발생 이번이 처음되지 않을 것 :

>>> __parse("blah.mp3") 

는, 나는이 오류가 발생 ,하지만 나는 그것이 옳지 않다는 것을 압니다. 어떤 사람이 내게 설명 할 수 있을까요?이 코드를 사용하여 놀아 보려고하는 이유는 무엇입니까? 내 용어의 이해 수준에 기인한다고 생각합니다. init 또는 self가 수행하는 작업이나 관련성이 거의 이해되지 않는 경우도 있습니다. def x (b) : print b는 def x (self, b)와 같습니다 : self.b = b print self.b 그렇지 않습니까? 왜 그렇게 중요합니까!

나는 단지 기본 설명을 원한다. 그래서 나는 이것을 내 머리 속에서 고칠 수있다. 고마워.

답변

8

def __parse은 일부 클래스 정의 안에 있습니다.

클래스 정의에서 메소드 정의를 가져올 수 없습니다. 메소드 함수 정의는 클래스의 일부입니다. 이 두 가지 예에서

봐 :

def add(a, b): 
    return a + b 

그리고

class Adder(object): 
    def __init__(self): 
     self.grand_total = 0 
    def add(self, a, b): 
     self.grand_total += a+b 
     return a+b 

노트.

  1. 이 기능은 self을 사용하지 않습니다.

  2. 클래스 메서드는 self을 사용합니다. 일반적으로 @classmethod과 같은 구체적인 데코레이터가없는 한 모든 인스턴스 메서드는 self을 사용합니다.

  3. 이 함수는 다른 어떤 함수에도 의존하지 않습니다.

  4. 클래스 메서드는 클래스 Adder의 인스턴스에 의해 호출됨에 따라 달라집니다. 또한 클래스 Adder의 인스턴스가 올바르게 초기화되었는지 여부에 따라 달라집니다. 이 경우 초기화 함수 (__init__)는 각 인스턴스 Adder이 항상 grand_total이라는 인스턴스 변수를 갖고 인스턴스 변수의 초기 값이 0임을 보장합니다.

  5. add 메서드 기능을 Adder 클래스에서 꺼내 별도로 사용할 수 없습니다. 독립형 기능이 아닙니다. 안에 클래스가 정의되어 있으며 그 위치가 인 클래스로 인해 특정 기대치가 있습니다.

+0

아, 그래서 init/self는 클래스와 함께 사용되어야하며, def가 아닌 그 안쪽 클래스와 함께 사용해야합니까? –

+0

또는 클래스에서 def __init__을 사용해야하고 클래스에서 사용되는 def (self, ...)도 def로 지정해야합니다. 모듈/메서드 자체에서는 자체가 없어야합니다. –

+1

기술적으로 "자기"는 키워드가 아닙니다. 실제로, 당신은 그것을 가장해야합니다. – Brian

0

self는 클래스의 instancemethod 래퍼에 의해 자동으로 전달됩니다. 이 함수는 래핑되지 않습니다. 그것은 방법이 아니며 단지 함수 일뿐입니다.자체 매개 변수가 필요하기 때문에 클래스에 연결하지 않으면 의미가 없습니다.

0

덧붙여서, 이며, 파이썬에서 클래스의 정적 메소드를 생성 할 수 있습니다. 가장 간단한 방법은 데코레이터 (예 : @staticmethod)를 사용하는 것입니다. 나는 이런 종류의 일이 대개 Pythonic 솔루션이 아니라고 생각합니다./방법이 클래스의 외부에서 작성하고 파이썬에서 기술을 사용할 수 있습니다

2

기능 monkeypatching 전화 : 당신이 클래스에 대한 약간 혼란스러워하고 객체 지향 프로그래밍을 같이

class C(object): 
    def __init__(self): 
    self.foo = 'bar' 

def __output(self): 
    print self.foo 

C.output = __output 
c = C() 
c.output() 
+0

둥근 방법에 관한 것 같습니다. 드문 예가 있습니까? – tgray

+0

많은 예제를 제공 할 수 있지만 클래스의 속성을 외부에 정의 된 함수로 설정하는 것이 모두 줄어 듭니다. Monkeypatching은 다른 라이브러리의 일부이거나 소스 코드가 없기 때문에 클래스 자체를 수정할 수 없을 때 가장 유용합니다. –

+0

나는 본다. 설명 주셔서 감사합니다! – tgray

1

보인다. '자아'는 다른 프로그래밍 언어에서 온 사람들을위한 파이썬의 문제 중 하나입니다. IMO 공식 튜토리얼은 그것을 잘 처리하지 못합니다. This tutorial 꽤 괜찮은 것 같습니다.

자바를 배웠다면, 파이썬에서 self은 java에서 this과 매우 비슷합니다. 차이점은 파이썬에서는 클래스 정의의 모든 함수에 대한 첫 번째 인수로 self을 나열해야한다는 것입니다.

파이썬이 첫 번째 프로그래밍 언어 (또는 첫 번째 객체 지향 언어) 인 경우이를 간단히 기억할 수 있습니다. 클래스의 일부인 함수를 정의하는 경우 다음을 수행해야합니다. 첫 번째 인수로 self을 포함하십시오. 클래스의 일부가 아닌 함수를 정의하는 경우 인수에 self을 포함하면 안됩니다. 클래스 함수를 사용하여 추가 코딩을하지 않고도 독립형으로 만들 수는 없습니다. 마지막으로, 을 호출 할 때 함수로 self을 포함하지 마십시오. 함수는입니다.

이러한 규칙에는 예외가 있지만 지금은 걱정할 가치가 없습니다.