2017-05-18 5 views
0

두 개의 파일이 있고 각각에 클래스가 들어 있다고 가정 해 보겠습니다. int.py에는 정수 클래스의 사용자 지정 구현이 있고 float.py에는 float 클래스의 사용자 지정 구현이 있습니다.서로 변환하는 별도의 파일에 두 개의 클래스를 작성합니까?

각 클래스가 다른 클래스로 변환 방법을 갖기를 원합니다. 예를 들면 :

class Integer: 
    def __init__(self, value): 
    self.value = value 

    def to_f(): 
    return Float(self.value) 

class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(): 
    return Integer(self.value) 

가 어떻게 그렇게 생성자를 사용할 수 있는지, 순환 종속성을 유발하지 않고 서로 파일을 가져올 수 있습니까?

+2

둘 다 같은 파일에 넣으십시오. 순환적인 가져 오기 문제가 발생하게됩니다. – inspectorG4dget

답변

2

메소드가 호출 될 때 당신은 클래스를 가져올 수 있습니다

class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(self): 
    from integer import Integer 
    return Integer(self.value) 

수입이 sys.modules에 캐시됩니다, 그래서 Float.to_i에 첫 번째 전화를 벗어나는 성능 저하가 없습니다.


대안은 모듈 자체를 가져오고 클래스 찾아 볼 수 있습니다 : (integerFloat를 서브 클래스 등)에는 모듈 수준 순환 종속성이없는 한만큼

import integer 

class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(self): 
    return integer.Integer(self.value) 

를, 당신은 '원 어떤 문제가 있습니다.


또 다른 (잠재적으로 복잡한) 대안 모듈 후 클래스를 가져올 것이다 :

호출 될 때 Float.to_i 바이
class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(self): 
    return Integer(self.value) 


from integer import Integer 

, Integer는 범위에있을 것이다. 필자는 실제 코드에서 처음 두 가지 방법을 사용하는 것을 기억합니다.

0

그냥 로컬 클래스를 가져옵니다

class Float: 
    def to_i(): 
    from .int import Integer # not run at module loading time 
    return Integer(self.value) 

class Integer: 
    def to_f(): 
    from .float import Float 
    return Float(self.value) 

이 모듈의 로딩 시간에 실행되는 수입을 방지하고, 따라서 원형의 수입을 방지 할 수 있습니다.