2015-11-30 79 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')