2012-11-13 2 views
5

이유를 알 수없는 코드 조각이 작동합니다. 그것은 내 이해에서 작동해서는 안됩니다. 문제는 쉽게 아래에 설명되어파이썬 가져 오기 문은 언제 필요합니까?

"Main.py"

from x import * #class x is defined 
from y import * #class y is defined 


xTypeObj = x() 
yTypeObj = y() 
yTypeObj.func(xTypeObj) 

"x.py"

class x(object): 

    def __init__... 
     ... 
    def functionThatReturnsAString(self): 
     return "blah" 

"y.py을"

#NO IMPORT STATEMENT NEEDED?? WHY 

class y(object): 
    def __init__... 
     ... 
    def func(self, objOfTypeX): 
     print(objOfTypeX.functionThatReturnsAString()) 

내 질문입니다 왜 "y.py"에

유형의 import 문이 필요하지 않습니까?
from x import functionThatReturnAString() 

이 메소드를 호출하는 방법은 무엇입니까?

+0

클래스에 대해 이야기하고 몇 가지 메소드를 호출하지만 모듈은 클래스 및 메소드가 아닌 함수 만 정의합니다. #confusion – heltonbiker

+4

[파이썬 튜토리얼] (http : //docs.python. org/2/tutorial /), 특히 [클래스에 대한 섹션] (http://docs.python.org/2/tutorial/classes.html)을 참조하십시오. –

+0

매개 변수로 전달했습니다. – Keith

답변

3

파이썬은 동적 유형 지정 언어입니다. C++ 및 Java와 같은 정적 유형화 된 언어와 달리 메소드에 대한 호출은 실제로 실행될 때까지 바인드되지 않으므로 왜 메소드를 정의 할 필요가 없는지 모듈을 가져 오는 것이 필요하지 않습니다.

  1. 방법 (데이터 구성원)에 추가하고 런타임에 인스턴스에서 제거 할 수 있습니다, 그래서 Foo 클래스의 두 인스턴스는 실제로는 동일한 유형의 경우에도 다른 방법이있을 수 있습니다 이것은 여러 가지 의미를 가지고있다.
  2. 메소드 (및 데이터 멤버)를 런타임에 클래스에 추가하거나 클래스에서 제거 할 수 있으므로 현재 인스턴스는 물론 새 인스턴스에 영향을 미칩니다.
  3. 기본 클래스는 런타임에 클래스에 추가 및 제거 할 수 있습니다.

동적 유형화 된 langauges와 정적 유형 언어 간의 모든 차이점을 모두 포함하지는 않습니다.

+0

"C++ 및 Java와 같은 정적 형식의 언어와 달리 메서드에 대한 호출은 실제로 실행될 때까지 바인딩되지 않으므로 왜 메서드를 정의했는지 모듈을 가져 오는 이유는 필요하지 않습니다."--- 정확히 내가 찾던 대답입니다. 감사! – Tommy

1

기능 yTypeObj.func은 클래스를 가져 오는 main.py에서 호출됩니다. 따라서 객체는 생성되고 모든 메소드 (functionThatReturnAStringobjOfTypeX의 메소드 임)와 함께 함수로 전달 될 수 있습니다.

+0

그래서 수입이 필요할 때 나는 정말로 이해하지 못합니다. y가 x의 함수를 호출하기 때문에 다른 클래스의 메소드를 호출하는 클래스에는 없습니다. – Tommy

+0

새 개체를 정의하려면 클래스 (또는 다른 특성)를 가져와야합니다. 그렇지 않으면 새 오브젝트를 생성하는 방법이 없습니다. 당신은 당신이 좋아하는 어떤 기능으로도 객체를 전달할 수 있습니다. (그러한 클래스의 존재를 인식 할 필요가 없습니다) – btel

9

파이썬은 객체 지향 프로그래밍 언어입니다. 그러한 언어에서 값은 객체이고 객체는 메소드를 가질 수 있습니다.

functionThatReturnsAString 함수는 클래스의 메서드이며 objOfTypeX은 해당 클래스의 인스턴스입니다. 클래스의 인스턴스는 클래스의 모든 메소드를 가지고 있습니다.

>>> alist = [] 
>>> alist.append(1) 
>>> alist 
[1] 

list 클래스는 .append() 방법이 있고, 그것을 호출 할 수 있도록 그 방법을 가져올 필요가 없습니다

이 예를 들어, 파이썬에서 list 객체가 .append() 방법을 왜이다 . 필요한 것은 목록 인스턴스에 대한 참조입니다. 기술적으로 말하기

는 파이썬 list유형이지만, 그 차이는 여기에 문제가되지 않습니다. 전체적으로 유형은이 토론의 목적을 위해 클래스와 동일한 것입니다.

Python Tutorial을 읽어 보시고, 다음 장의 클래스에 대해 설명해주십시오. 그러나 먼저 챕터의 첫 번째 세트를 살펴 보시기 바랍니다.

+1

제 답변이 정확하고 도움이되지 않았습니다. 마르틴과 같이가. :-) –

+0

당신의 대답은 마치 내가 내가 아닌 것보다 더 무식한 것처럼 보였습니다. 문제는 "객체 지향"이 아니라, 클래스의 인스턴스가 무엇인지 압니다 ... 저는 C++ 세계 출신입니다. 질문은 "동적 대 정적 유형"입니다. C++에서 y.py의 경우 objOfTypeX.functionThatReturnsAString()의 서명을 제공하는 헤더를 포함해야합니다. 그렇지 않으면 컴파일 타임에 "objOfTypeX에 명명 된 메소드가 없습니다 ..."라고 표시됩니다. 파이썬에서 나는이 메소드가 런타임에 존재할 것으로 생각하고 그렇지 않으면 에러를 던진다. 당신의 대답은 이것에 대해 다루지 않았기 때문에 나는 다른 것을 받아들입니다. – Tommy

+0

즉, funct()가 functionThatReturnsAString() 메서드가 실제로 존재한다는 사실을 알 필요가없는 이유는 확실하지 않았습니다. 실제로이 함수가 실제로 존재한다는 것을 y.py에게 알려줌으로써 C++에서 "증명"해야합니다. 나는 파이썬이 그러한 증명을 필요로하지 않는다는 것을 몰랐고, 런타임에 "이 함수는 당신이 말한 것처럼 존재하지 않는다"고 말했습니다. – Tommy