2013-06-20 4 views
1

저는 파이썬을 단계별로 배우고 있습니다. 오늘은 객체 지향 프로그래밍에 대해 설명합니다. 나는 간단한 수업을 만들고 사용하는 법을 알고 있지만, 뭔가 저를 괴롭 힙니다. 파이썬에서 사용하는 대부분의 객체는 생성자를 호출 할 필요가 없습니다.__init__ 메소드를 호출하지 않고 파이썬 클래스 사용하기?

어떻게 작동합니까? 또는 생성자가 암시 적으로 호출 되었습니까? 예 :

내가 (실제로 작동) 이런 식으로 갈 것이다

(http://www.diveinto.org/python3/xml.html#xml-parse에서)

>>> import xml.etree.ElementTree as etree  
>>> tree = etree.parse('examples/feed.xml') 
>>> root = tree.getroot()      
>>> root 
<Element {http://www.w3.org/2005/Atom}feed at cd1eb0> 

:

>>> import xml.etree.ElementTree as etree 
>>> tree = etree.ElementTree() # instanciate object 
>>> tree.parse('examples/feed.xml') 

내가 프로그래밍이 방법을 사용하려면을 (호출하지 않습니다 생성자, 또는 적어도 암묵적으로 내 자신의 프로젝트에 대한 호출),하지만 난 정말 어떻게 작동받을 수 없습니다.

감사합니다.

+2

은'.parse()는'기능은 당신을 위해 개체를 만듭니다. 함수가 그렇게 할 수 있습니다. 물건을 한 다음 결과를 반환하십시오. 왜 놀랍 죠? –

+0

질문 제목에 대한 답을 찾는 누군가가 여기에 오면 쉽게 할 수 있습니다. 빈 메소드를 사용하여'__init__'를 오버라이드하는 서브 클래스를 생성하십시오. – tripleee

+0

이 질문에 직접 대답하지는 않지만 Python 프로그래밍 전체와 클래스에 적용됩니다. 클래스에는 마법 메서드가 있습니다. '__init__'은 하나이지만 많은 것들이 있습니다. 팩토리 함수로는 할 수 없을지라도, 당신의 질문과 당신이하고자하는 것에 관련된'__call__' 메쏘드를 조사해야합니다. http://www.rafekettler.com/magicmethods.html#callable – RyPeck

답변

2

이 경우 발생하는 문제는 etree.parse() 함수가 ElementTree 개체를 생성하여 반환한다는 것입니다. 그래서 생성자를 직접 호출 할 필요가 없습니다. 그것은 parse 함수에 싸여 있습니다. 이 함수는 ElementTree 인스턴스를 만들고 데이터를 구문 분석하고 파싱 된 정보를 올바르게 나타내도록 새 개체를 수정합니다. 그러면 returns 객체를 사용할 수 있으므로 실제로 사용할 수 있습니다 (실제로는 source을 보면 두 번째 예제에서 작성한 내용을 본질적으로 수행합니다).

이것은 객체 지향 프로그래밍에서 꽤 일반적인 관용구입니다. 대체로 말해서, factory function이라고합니다. 기본적으로 복잡한 객체의 경우 특히 유용한 객체 인스턴스를 만드는 데 많은 작업이 필요합니다. 따라서 객체 생성자에 많은 로직을 저장하는 대신 하나 이상의 팩토리 함수를 만들어 객체를 만들고 필요에 따라 구성하는 것이 더 깔끔합니다. 즉, 라이브러리를 사용하여 개발중인 누군가가 인스턴스화가 복잡 할 수있는 "내부적 인 경우"에도 클래스를 인스턴스화 할 수있는 여러 가지 간단하고 간단한 방법이있을 수 있습니다.

1

첫 번째 경우에는 모듈에서 도우미 함수를 호출하고 있습니다. 클래스 메소드가 아닙니다 (내부적으로 객체를 생성 한 다음 그 메소드를 호출 할 수도 있음). 두 번째 경우에는 객체를 인스턴스화 한 다음 객체를 호출하는 것입니다.

6

etree.parse은 팩토리 기능입니다. 그들의 목적은 주로 객체 (인스턴스)를 구성하는 편리한 방법이되는 것입니다. looking at the source으로 쉽게 확인할 수 있으므로 parse 함수는 두 번째 예제에서와 거의 동일합니다. 단, 코드 한 줄 또는 두 줄만 제외하면됩니다.

+0

감사합니다. 실제로 소스를 살펴 보았지만 ElementTree 클래스의 .parse() 메소드에 정착했습니다. http://hg.python.org/cpython/ file/2.7/Lib/xml/etree/ElementTree.py # l644 어떤 개체를 instanciate하지 않기 때문에 나를 혼란스럽게 만들었습니다. – CJlano

+2

@CJlano 당신이 보았던 * 방법 *과 mgilson이 링크 된 * 함수 * 사이의 주요 차이점입니다. A * 메쏘드 *는 이미 인스턴스에 바인딩되어 있습니다 : 그것은'self' 매개 변수의 의미입니다. 반면에 A * 함수 *는 모듈 수준에 있으며 암시 적으로 객체 인스턴스에 대한 참조가 제공되지 않으므로 필요한 경우 하나를 만들어야합니다. –

+0

@HenryKeiter : Python에서 메소드가 반드시 인스턴스에 바인딩되는 것은 아닙니다. 또한 'classmethod' (대체 생성자에 매우 유용합니다),'staticmethod' 또는 언 바운드'instancemethod' (이 경우에는 명시 적으로 인스턴스를 전달하십시오). –

1

클래스 이름이 ClassName 인 경우 을 호출하면 __init__()이 호출되고 ClassName이라는 새 인스턴스가 반환됩니다.

ClassName__init__이 정의되지 않은 경우 수퍼의 __init__이 호출됩니다. 귀하의 경우에는

,이 모든 함수 내부 :

def name(foo): 
    return ClassName(foo) 

n = name("bar") # a function call returns a new instance 
관련 문제