以编程方式在 Python 中指定基数 类 的列表
Specifying the list of base classes in Python programmatically
我需要根据标志来决定 类 从哪个派生。
例如:
if SOME_FLAG:
class A(B,C):
...definitions...
else:
class A(B):
...definitions...
问题是如何避免重复 ...definitions...
我尝试像对普通函数那样使用参数列表,但它不适用于 类:
base_classes = [B,C] if SOME_FLAG else [B]
class A(*base_classes):
...definitions...
但是这个语法是无效的。
(我知道有动态添加 super类 的技巧,但这种情况不同:它是定义时自定义,而不是 base 类 的完全动态重新定义)
最简单的方法可能是有条件地定义一个中间值 class,然后从中导出 class A
。
X = B
if SOME_FLAG:
class X(B, C): pass
class A(X):
# definitions
也可以编写一个接受父 class 序列的元class,尽管这看起来有点过分:
def meta(name, bases, dict):
if len(bases) == 1 and isinstance(bases[0], (tuple, list)):
bases = bases[0]
return type(name, bases, dict)
parents = (B, C) if SOME_FLAG else B
# Python 3
class A(parents, metaclass=meta):
# definitions
# Python 2
class A(parents):
__metaclass__ = meta
# definitions
我需要根据标志来决定 类 从哪个派生。
例如:
if SOME_FLAG:
class A(B,C):
...definitions...
else:
class A(B):
...definitions...
问题是如何避免重复 ...definitions...
我尝试像对普通函数那样使用参数列表,但它不适用于 类:
base_classes = [B,C] if SOME_FLAG else [B]
class A(*base_classes):
...definitions...
但是这个语法是无效的。
(我知道有动态添加 super类 的技巧,但这种情况不同:它是定义时自定义,而不是 base 类 的完全动态重新定义)
最简单的方法可能是有条件地定义一个中间值 class,然后从中导出 class A
。
X = B
if SOME_FLAG:
class X(B, C): pass
class A(X):
# definitions
也可以编写一个接受父 class 序列的元class,尽管这看起来有点过分:
def meta(name, bases, dict):
if len(bases) == 1 and isinstance(bases[0], (tuple, list)):
bases = bases[0]
return type(name, bases, dict)
parents = (B, C) if SOME_FLAG else B
# Python 3
class A(parents, metaclass=meta):
# definitions
# Python 2
class A(parents):
__metaclass__ = meta
# definitions