2014-11-24 2 views
2

가 난 내 자신의 목적을 위해 하위 클래스에하고 싶은 타사 시스템에서 클래스이지만, 그것은과 같이, 함수 내에서 정의되어 :함수 안에 정의 된 클래스를 가져올 수 있습니까?

def foo(): 
    class Bar(): 

    return Bar 

난 그냥 그것을 가져 오려고하면 from x import bar, ImportError: cannot import name 'Bar'이 있습니다. Bar (바)를 가져올 수 있습니까? 아마도 원래 코더는 다른 사람들이 직접 사용하지 못하도록 특별히 클래스 안에 클래스를 넣었을 것입니다.

내가 얻으려고 클래스는 여기에서 찾을 수 있습니다 BaseCookieSessionFactory 내에 정의 CookieSession,이다 : http://docs.pylonsproject.org/projects/pyramid/en/master/_modules/pyramid/session.html

그것은 이미 내가 원하는 걸의 90 %를 수행하고, 낭비 것처럼 보인다 처음부터 내 자신을 구현하려면 코드의 대부분을 복사하여 붙여 넣기 만하면됩니다. 이 foo 때까지 존재하지 않기 때문에,

from pyramid.session import SignedCookieSessionFactory 

def MySessionFactory(secret, [other args here...]): 
    @implementer(ISession) 
    class MySession(SignedCookieSessionFactory(secret)): 
     ... 
    return MySession 
+1

'foo' 함수를 가져온 다음'c = foo()'함수를 호출하여 클래스'c '를 가져와야합니다. 그렇게하는 것이 당신이하려고하는 것에 효과가없는 어떤 이유가 있습니까? –

+2

'Bar'라는 단일 클래스가 없습니다. 오히려,'foo()'를 호출 할 때마다'Bar'라는 이름의 * 새로운 클래스 *가 생성되고 그에 대한 참조가 리턴됩니다. –

답변

4

당신은 가져올 수 없습니다

편집 : Chepner의 대답의 조언에 따라 , 나는 내 자신의 공장 기능을 구축하여-분류 SUB 사실 입니다. 그러나 foo은 단순히 함수를 정의하고이 함수에 대한 참조를 반환합니다. 그럴 경우

from otherfile import foo 
Bar = foo() 

x = Bar() # create an instance of Bar 
+0

그럴 경우 어떻게 Sub-Class Bar를 사용할 수 있습니까? MyBar (foo()) 클래스를 작성하는 것은 약간 해킹 된 것처럼 보입니다. –

+1

@NateAllen - chepner가 말한 것을 수행 한 다음'class MyBar (Bar) :'를 수행하십시오. 그것은 당신이 얻을 수있는만큼 깨끗합니다. – iCodez

+3

또한 팩토리 함수의 전체 점을 호출하여 클래스에 대한 참조를 반환해야합니다. 이렇게하는 것은'BaseCookieSessionFactory'로 할 일입니다. 반환 값을 전혀 서브 클래스 할 필요가 없을 수도 있습니다. 적절한 값을 함수에 전달하면 반환 된 클래스를있는 그대로 사용할 수 있습니다. – chepner