动态类创建 - Python

时间:2016-10-19 11:19:14

标签: python oop inheritance

以下是该方案:

我有两个班级:

class A:
  pass:

class B:
  pass

现在我想创建一个客户端,因为我需要一个小的实用工具方法,它应该返回我的类模板/对象,例如:类A,类B,因为我将类名传递给该实用程序,例如{ {1}}。

现在,这可能吗?如果那时请提出一个方法,因为我现在没有在网上得到任何正确答案。

希望我有意义。

3 个答案:

答案 0 :(得分:2)

这是一个可能的实现。所有代码都包含在一个'.py'文件中

class A:                                                                                            
   pass                                                                                             


class B:                                                                                            
   pass                                                                                             

# map class name to class                                                                                                    
_classes = {                                                                                        
         A.__name__: A,                                                                             
         B.__name__: B,                                                                             
}                                                                                                   

def get_obj(cname):                                                                                       
    return _classes[cname]()                                                                            

# test the function                                                                                                    
if __name__ == '__main__':                                                                          
   print get_obj('A')   

它将产生以下输出

<__main__.A instance at 0x1026ea950>

答案 1 :(得分:0)

标准库函数namedtuple创建并返回一个类。在内部,它使用import matplotlib.pyplot as plt import numpy as np data = [0,1,2,3,4] binwidth = 1 plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth)) plt.xlabel('Time') plt.ylabel('Counts') plt.show() 。它可能是你需要的灵感。

源代码:https://github.com/python/cpython/blob/master/Lib/collections/init.py#L356

答案 2 :(得分:0)

globals()返回一个字典,其中包含在模块的全局范围内定义的所有符号(包括类AB):

a_and_b_module.py

class A: pass
class B: pass

def get_cls(cls_name):
    return globals()[cls_name]

如果您正在寻找简洁

如果调用此函数的代码在模块内部,则可以完全取消该函数并直接使用globals()[cls_name]

如果调用此函数的代码在模块外部,则可以使用getattr函数:

a_and_b_module.py

class A: pass
class B: pass

another_file.py

import a_and_b_module

cls_name = 'A'
chosen_cls = getattr(a_and_b_module, cls_name)

如果您正在寻找完全控制

上述方法的问题在于它可以返回 a_and_b_module.py 中定义的任何内容,而不是将自身限制为AB。如果您想确保只能返回A和B:

class A: pass
class B: pass

allowed_classes = ('A', 'B')

def get_cls(cls_name):
    assert cls_name in allowed_classes
    return globals()[cls_name]

注意:您可能也对factory的概念感兴趣。