2012-01-22 6 views
3

저는 프로젝트에서 자주 재사용 될 다양한 함수의 라이브러리를 만들고 있습니다. 각 함수는 stateless입니다 (작성시 매개 변수가 필요하지 않으며 메모리가 없습니다). 일부 기능은 다른 기능을 사용합니다.파이썬 : 상태 비 저장 함수 라이브러리 디자인

이 함수는 나머지 프로젝트에서 인수로 전달됩니다.

다음 중 어떤 접근 방법이 더 좋습니까?

class F1: 
    def __call__(x): 
    # use x 

f1 = F1() 

class F2(F1): 
    def __call__(x): 
    # use x and f1 

f2 = F2() 
: 사용에 기초

def f1(x): 
    # use x 

def f2(x): 
    # use x and f1 

2.Define 모든 클래스의 메소드로서 기능, 및 계층 구조의 클래스를 준비 :

1.Define에게 특정 모듈 전역 함수로서 모든 기능

옵션 2를 고려한 이유는 일부 기능에 공통적 인 점이 있기 때문입니다. 예 : 함수 f2, f3, f11은 모두 f1으로 전화를 시작합니다. 내가 어떤 지점을 볼 수 없습니다, 당신은이가 상태 함수는 경우가되지 않을 것 수업에 데이터를 저장하지 않는 경우

class F1: 
    def __call__(self, x): 
    self.f1(x) 
    self.calc(x) 
    def f1(self, x): 
    # do something 
    # don't define calc here; F1 is abstract base class 

class F2(F1): 
    def calc(self, x): 
    # do something 

class F3(F1): 
    def calc(self, x): 
    # do something 
+3

어디에서 2 할 아이디어를 얻었습니까? –

+0

@FrancisAvila : 내 생각을 설명하기 위해 업데이트 된 질문을 참조하십시오. – max

+0

'F2'와'F3'는'F1'을 확장 시켰습니까? 그것은 코드가 말하는 것은 아닙니다 ... –

답변

2

옵션 1은 훨씬 간단합니다. 옵션 2는 불필요하게 복잡합니다 !!

1.1 : 쉽게 테스트 할 수 있습니다

또 다른 제안. 하나의 모듈에서 단일 클래스의 메소드로 모두 정의하십시오. 적절하게 @staticmethod 및 @classmethod 데코레이터를 사용하십시오. 이렇게하면 모의 객체로 대체하거나 나중에 새 클래스 나 서브 클래스를 제공함으로써 대체 구현으로 대체하기가 더 쉬워 질 수 있습니다.

spam.py :

class Spam(object): 
    @staticmethod 
    def f1(x): 
    # use x 

    @classmethod 
    def f2(cls, x): 
    # use x and cls.f1 

이 그래서 당신은 위의 필요있을 때까지 옵션 1을 고수 할 단지 수 있습니다 여전히 더 복잡합니다.

+0

'@ classmethod '를 통해 여러분이 제안하는 것은 내가 생각하고있는 것과 비슷합니다. 나는 모든 것을 강제로'@ classmethod '로 만들고 싶지 않았습니다. 언젠가는 함수에 상태를 추가하려고 할지도 모른다고 생각했기 때문입니다. 어쨌든 수업을 작성하고 있기 때문에 잠재적 인 필요성에 대한 유연성을 유지하는 것이 어떻습니까? – max

+0

API를 변경하지 않고 상태가 필요할 경우 클래스 또는 객체로 함수를 대체하는 방법이 있습니다. – kindall

+0

@kindall : 아 사실입니다. 나는 이것을 생각하지 않았다. 꽤 쉽습니다. 단지'__call__'을 사용하십시오. – max

2

: 나는이 같은 작업을 수행 할 수 있습니다 생각 그들을 사용하여. 파이썬에서는 모듈 수준에서 함수를 정확하게 정의 할 수 있으므로 실제로 클래스의 기능이 필요하지 않는 한 클래스를 사용할 필요가 없습니다.

3

처음이나 마지막에 몇 가지 공통 코드를 실행하는 데 필요한 여러 함수가 있다면 장식 코드에 explained here과 같은 일반 코드를 넣을 수 있습니다.

관련 문제