python - 根据对象实例化的位置,对对象实例化执行其他操作

标签 python

我有一个 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/

相关文章:

python - 如何从 python 字典中的列表中提取键的所有实例?

python - 只创建一个 zip 包而不是每个文件的校验和就足够了吗

python - 将迁移文件添加到存储库是好的做法吗?

python - 在哪里可以找到 python 的内置类的方法和属性?

python - Selenium ( python ): can't switch to iframe (name is dynamically generated)

python - (索引错误: list index out of range) My for loop is giving me an error?

python - 提取网页上引号内的文本

python - 如何将行数堆叠到一行并分配id

python - 操作系统改变目录结构

python - 在 Django 中运行测试时出现 NoReverseMatch 错误