Python 是否使用其他类定义创建具有不同默认参数的新类定义?
假设我在Python 2.7中有以下类:Python 是否使用其他类定义创建具有不同默认参数的新类定义?,python,class,Python,Class,假设我在Python 2.7中有以下类: class X(): def __init__(self, alpha=1): self.alpha = alpha print self.alpha def beta(self, gamma=1): self.gamma = gamma self.omega = self.alpha + self.gamma print self.omega 我想使用类
class X():
def __init__(self, alpha=1):
self.alpha = alpha
print self.alpha
def beta(self, gamma=1):
self.gamma = gamma
self.omega = self.alpha + self.gamma
print self.omega
我想使用类定义创建另一个具有不同默认参数的类定义,例如:
Y = f(X, alpha=2, gamma=2)
或
这应等同于:
class Y():
def __init__(self, alpha=2):
self.alpha = alpha
print self.alpha
def beta(self, gamma=2):
self.gamma = gamma
self.omega = self.alpha + self.gamma
print self.omega
在Python2.7(或3?)中是否可以执行类似的操作
(我知道您可以使用
functools.partial
对函数进行等效;因此我想知道类是否有类似的功能)您可以编写一个函数,为您创建类:
def makeclass(alpha, gamma):
class C():
def __init__(self, alpha=alpha):
self.alpha = alpha
print self.alpha
def beta(self, gamma=gamma):
self.gamma = gamma
self.omega = self.alpha + self.gamma
print self.omega
return C
这是可以做到的,但有点乱
此代码:
class Foo(base1, base2, ...):
bar = something
baz = something_else
def qux(self):
...
…相当于此代码,但如果Foo
是一个经典类,我不确定这是否正确:
Foo = type('Foo', (base1, base2, ...), {'bar': something, 'baz': something_else,
'qux': lambda self: ...})
因此,我们可以动态创建类,并将自定义方法对象附加到它们
对于您的特定情况,我们需要进行这些调用(假设您通过继承对象
将X转换为一个新样式的类)。首先,我们从X中提取方法并应用functools.partial
:
new_init = functools.partial(X.__init__.im_func, # Just X.__init__ in 3.x
alpha=2)
new_beta = functools.partial(X.beta.im_func, # Just X.beta in 3.x
gamma=2)
im_func
属性从未绑定的方法对象中获取基础函数。在Python3中,没有未绑定的方法,所以我们不需要使用这个属性X._init__
只是函数本身
接下来,我们创建类:
Y = type('Y', (object,), {'__init__': new_init, 'beta': new_beta})
不幸的是,我们没有任何合理的方法来获得需要在这里重新定义的函数列表。如果我们使用dir()。我们可以使用类的\uuuu dict\uuuu
,但这不包括任何继承的方法。我认为我们可能需要搜索X.\uu mro\uu
以获得完全正确的方法列表:
result = {}
for class_ in X.__mro__:
for name, value in class_.__dict__.items():
if name not in result:
result[name] = value
我们还需要弄清楚在每种情况下要覆盖哪些参数;这是一个很好的起点,但如果任何方法都是可变的(即,如果它们采用*args
或**kwargs
参数),则没有多大帮助。您真的需要另一个类吗?您可以编写一个工厂函数,创建一个公共类的实例,但使用不同的默认值。
Y = type('Y', (object,), {'__init__': new_init, 'beta': new_beta})
result = {}
for class_ in X.__mro__:
for name, value in class_.__dict__.items():
if name not in result:
result[name] = value