我有一个 API 类(它将被其他类扩展和使用):
class A(object):
def __init__(self, **kwargs):
self.kwargs = kwargs
@classmethod
def create(cls, **kwargs):
return cls(**kwargs)
它的扩展是:
class B(A):
pass
现在,这就是我想要的:如果我像 B(arg1=1, arg2=2)
那样实例化 B 类,我想在以下情况下执行一些额外操作初始化它,例如验证 kwargs
参数(此代码应驻留在类 A 中,而不是 驻留在 B 中)。然后,如果我执行 B.create(arg1=1, arg2=2)
,则验证应该不会发生。
简而言之,我想在仅从定义的类的外部初始化对象时执行额外的操作;从类内的类方法初始化对象应该不会触发任何额外的操作。
最佳答案
您可以使用附加参数来区分类初始化方法:
class A(object):
def __init__(self, __a_validate=True, **kwargs):
self.kwargs = kwargs
if __a_validate:
print 'do validation'
@classmethod
def create(cls, **kwargs):
return cls(__a_validate=False, **kwargs)
演示:
>>> B.create(arg1=1, arg2=2)
<__main__.B object at 0x9b82f4c>
>>> B(arg1=1, arg2=2)
do validation
<__main__.B object at 0x9b7bbcc>
评论更新:
这是另一种解决方案。您可以在create
方法中修改类属性,例如将validate
函数设置为None
,调用构造函数然后设置validate
> 回到原始状态:
class A(object):
def __init__(self, **kwargs):
self.kwargs = kwargs
if self.validate:
self.validate(kwargs)
def validate(self, kwargs):
print 'do validation'
@classmethod
def create(cls, **kwargs):
tmp = cls.validate
cls.validate = None
instance = cls(**kwargs)
cls.validate = tmp
return instance
关于python - 根据对象实例化的位置,对对象实例化执行其他操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21973904/