2015-11-30 68 views
0
# -*- 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 

什么是实现以下结果的Python的方式:的Python:类处理,其中依赖于父类继承的类可变变量

  1. 当结果从CHILD2继承 - 我想getattr(Result, 'result_string')显示child2_replace child2_format

  2. 当结果从Child1继承 - 我想getattr(Result, 'result_string')显示child1_replace parent_format

问题是Result类应该是通用的 - 当这个类继承自Child1或Child2时,代码应该工作。如何在Python中实现这一点?

回答

0

您可以使用properties来完成此操作。然后,您可以重写子类中的必要属性以实现所需的结果。例如:

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')) 

当该脚本运行时,它输出:

child1_replace parent_format 
child2_replace child2_format 
0

我使用类方法,不知道这是否是好的解决了这个问题,但它的作品。

# -*- 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')