在函数中动态创建 Python 子类
Dynamically Create a Python Subclass in a Function
我想写一个创建动态子类的函数。
例如:
def get_class(num):
...
...
return _class
这个函数接受一个整数num
然后构造这样一个类
class Test(BaseClass):
attr_1 = 1
attr_2 = 1
...
attr_num = 1
和return它。
我想知道这是否可以在不编写元类的情况下实现。
您可以使用type
函数动态创建class。 documentation for type 几乎准确地描述了您要完成的任务。像这样:
class BaseClass(object):
pass
def get_class(num):
attrs = [('attr_%d' % i, 1) for i in range(num)]
return type('Test', (BaseClass,), dict(attrs))
正如另一个答案中提到的,您可以使用 type
,在这种情况下您可以动态构造属性:
def foo(num, **kwargs):
kwargs.update({'num': num})
return type('Foo', (BaseClass,), kwargs)
或者如果您不需要动态键,您可以简单地手动实例化一个 class:
def foo(num):
class Foo(BaseClass):
num = num
return Foo
我想写一个创建动态子类的函数。 例如:
def get_class(num):
...
...
return _class
这个函数接受一个整数num
然后构造这样一个类
class Test(BaseClass):
attr_1 = 1
attr_2 = 1
...
attr_num = 1
和return它。
我想知道这是否可以在不编写元类的情况下实现。
您可以使用type
函数动态创建class。 documentation for type 几乎准确地描述了您要完成的任务。像这样:
class BaseClass(object):
pass
def get_class(num):
attrs = [('attr_%d' % i, 1) for i in range(num)]
return type('Test', (BaseClass,), dict(attrs))
正如另一个答案中提到的,您可以使用 type
,在这种情况下您可以动态构造属性:
def foo(num, **kwargs):
kwargs.update({'num': num})
return type('Foo', (BaseClass,), kwargs)
或者如果您不需要动态键,您可以简单地手动实例化一个 class:
def foo(num):
class Foo(BaseClass):
num = num
return Foo