2014-11-24 77 views
2

有一个来自我想子类我自己的目的第三方系统的一类,但它是一个函数中定义的,就像这样:是否可以导入在函数中定义的类?

def foo(): 
    class Bar(): 

    return Bar 

如果我尝试只是导入from x import bar,我得到ImportError: cannot import name 'Bar'。是否有可能(或明智)导入Bar?也许最初的编码器专门把这个类放在函数里,以防止别人直接使用它?

我试图让这个类是CookieSession,里面BaseCookieSessionFactory定义,它可以在这里找到: http://docs.pylonsproject.org/projects/pyramid/en/master/_modules/pyramid/session.html

它已经做90%的我想要的东西,它似乎将是一种浪费从头开始实现我自己,因为我只是复制粘贴了大部分代码。

编辑: 继Chepner的答复意见,我通过建设自己的工厂函数子类是:

from pyramid.session import SignedCookieSessionFactory 

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

你需要导入函数'foo',然后调用'c = foo()'来获得类'c'。有没有任何理由不这样做,你会试图做什么? – 2014-11-24 21:27:48

+2

没有一个“Bar”类。相反,每次调用'foo()'时,都会创建一个名为'Bar'的*新类,并返回对其的引用。 – 2014-11-24 21:29:27

回答

4

您不能导入它,因为它不存在,直到foo实际上是,叫做。但是,看起来foo只是定义该函数并返回对其的引用。在这种情况下,你只需要像下面这样的东西:

from otherfile import foo 
Bar = foo() 

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

在这种情况下,是否有可能子类Bar?编写MyBar类(foo()):看起来有点怪异。 – 2014-11-24 21:32:10

+1

@NateAllen - 做什么chepner说,然后做'班MyBar(酒吧):'。这是尽可能干净,你可以得到。 – iCodez 2014-11-24 21:33:59

+3

另外,请注意工厂函数的全部要被调用以返回对类的引用。这样做正是你用'BaseCookieSessionFactory'处理的意思。有可能你根本不需要继承返回值;如果将适当的值传递给该函数,则可以按原样使用返回的类。 – chepner 2014-11-24 21:35:01

相关问题