Python:在依赖于父类的继承类中处理可变变量的类

Python:在依赖于父类的继承类中处理可变变量的类,python,inheritance,Python,Inheritance,达到以下效果的肾盂方法是什么: 当Result从Child2继承时-我希望getattr(Result,'Result\u string')显示Child2\u替换Child2\u格式 当结果从Child1继承时-我希望getattr(Result,'Result\u string')显示Child1\u replace parent\u格式 问题是结果类应该是通用的——当这个类从Child1或Child2继承时,代码应该工作。如何在Python中实现这一点 您可以使用来完成此任务。然后可以重写

达到以下效果的肾盂方法是什么:

  • 当Result从Child2继承时-我希望
    getattr(Result,'Result\u string')
    显示
    Child2\u替换Child2\u格式

  • 当结果从Child1继承时-我希望
    getattr(Result,'Result\u string')
    显示
    Child1\u replace parent\u格式

  • 问题是结果类应该是通用的——当这个类从Child1或Child2继承时,代码应该工作。如何在Python中实现这一点

    您可以使用来完成此任务。然后可以重写子类中的必要属性,以获得所需的结果。例如:

    # -*- coding: utf-8 -*-
    
    class CommonParent(object):
    
        mutable_field = u'parent_replace'
        format_field = u'parent_format'
        full_pattern = u'{{to_replace}} {to_format}'
    
        pattern = full_pattern.replace(u'{{to_replace}}', mutable_field)   
    
        result_string = pattern.format(
            to_format=format_field            
        )
    
    class Child1(CommonParent):
    
        mutable_field = u'child1_replace'
    
    
    class Child2(CommonParent):
    
        mutable_field = u'child2_replace'
        format_field = u'child2_format'
    
    
    class Result(Child1):
    
        pass
    
    运行此脚本时,它会输出:

    class CommonParent(object):
    
        @property
        def format_field(self):
            return u'parent_format'
    
        @property
        def mutable_field(self):
            return u'parent_replace'
    
        @property
        def result_string(self):
            return '{0} {1}'.format(self.mutable_field, self.format_field)
    
    
    class Child1(CommonParent):
        @property
        def mutable_field(self):
            return u'child1_replace'
    
    
    class Child2(CommonParent):
        @property
        def format_field(self):
            return u'child2_format'
    
        @property
        def mutable_field(self):
            return u'child2_replace'
    
    
    class Result1(Child1):
        pass
    
    
    class Result2(Child2):
        pass
    
    
    if __name__ == '__main__':
        r1 = Result1()
        print(getattr(r1, 'result_string'))
    
        r2 = Result2()
        print(getattr(r2, 'result_string'))
    

    我已经用classmethod解决了这个问题,不确定它是否正确,但它是有效的

    child1_replace parent_format
    child2_replace child2_format
    
    # -*- coding: utf-8 -*-
    
    class CommonParent(object):
    
        mutable_field = u'parent_replace'
        format_field = u'parent_format'
        full_pattern = u'{{to_replace}} {to_format}'
    
        @classmethod
        def setVariables(cls):
    
            cls.pattern = cls.full_pattern.replace(u'{{to_replace}}', cls.mutable_field)   
    
            cls.result_string = cls.pattern.format(
                to_format=cls.format_field            
            )
    
    class Child1(CommonParent):
    
        mutable_field = u'child1_replace'
    
    
    class Child2(CommonParent):
    
        mutable_field = u'child2_replace'
        format_field = u'child2_format'
    
    
    class Result(Child1):
    
        def __init__(self):
    
            super(Result, self).setVariables()
    
    result = Result()
    print getattr(result, 'result_string')