【问题标题】:Python: Dictionary: Based on the key provided return an initialized class object variablePython:字典:根据提供的键返回一个初始化的类对象变量
【发布时间】:2015-09-29 05:49:26
【问题描述】:

我是学习 python 的新手。

我的情况是我有很多课程,例如。 g.:

class A:
    def __init__(self, entry):
        ...

    def printf(self)
        print "A"

class B:
    def __init__(self, entry):
        ...

    def printf(self)
        print "B"

class C:
    def __init__(self, entry):
        ...

    def printf(self)
        print "C"

接下来,我想做的是有一本字典,像这样:

OBJECT_LIBRARY = {'A': A(), 'B': B(), 'C': C()}

因此,当我使用“KEY”引用字典时,字典应该返回该类型的初始化对象

我怎样才能做到这一点?

【问题讨论】:

    标签: python class dictionary


    【解决方案1】:

    如果类没有初始化变量,那么

    OBJECT_LIBRARY = {'A': A, 'B': B, 'C': C}
    
    OBJECT_LIBRARY['A']()
    

    如果你有初始化变量,那么你可以这样做

    OBJECT_LIBRARY = {'A': lambda : A(a, b), 'B': lambda : B(b, c)} # assuming a, b, c are defined
    
    OBJECT_LIBRARY['A']()
    

    【讨论】:

    • 您能否解释一下为什么在第二种情况下需要 lambda?
    • 它使dict 值可调用,可用于创建具有一组固定构造函数参数的对象。没有必要使用lambdas 来获得这种效果;如果您更喜欢使用电池而不是使用lambdas 重新发明轮子,functools.partial(A, a, b) 的工作方式与 lambda: A(a, b) 类似(尽管它仍然允许您使用附加参数调用生成的可调用对象)。
    【解决方案2】:

    为什么不用引用类(而不是对象)来定义字典,然后在引用字典时定义对象?

    例子-

    OBJECT_LIBRARY = {'A': A, 'B': B, 'C': C}
    

    然后你会像使用它一样 -

    OBJECT_LIBRARY['A']() #Or other classes as needed.
    

    【讨论】:

      【解决方案3】:

      如果您使用OBJECT_LIBRARY = {'A': A(), 'B': B(), 'C': C()},它只是存储对象(而不是创建新对象)。相反,存储将创建和初始化对象的函数。像这样:

      >>> class A(object):
          def __init__(self,entry):
              self.entry = entry
      
          def printf(self):
              print "A", self.entry
      
      
      >>> class B(object):
          def __init__(self,entry):
              self.entry = entry
      
          def printf(self):
              print "B", self.entry
      
      
      >>> object_library = {'A':lambda:A('a'), 'B':lambda:B('b')}
      >>> new_and_initialized_A = object_library['A']()
      >>> new_and_initialized_A.printf()
      A a
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 2020-07-02
        • 2012-01-20
        • 1970-01-01
        相关资源
        最近更新 更多