2016-06-27 4 views
0

属性:合計二つの異なるクラスがファーストクラスに属性私はそのようにすることができ、私は2クラスを持っていると私は2番目のクラスを追加したいとしましょう

class first: 
    def __init__(self): 
     self.value_one = 2 
     self.value_two = 5 
     self.value_third = 7 #second class don't have that attribute 

    def sum_class(self, cls): 
     for attribute in cls.__dict__: 
      x = getattr(cls, attribute) 
      y = getattr(self, attribute) 
      setattr(self, attribute, x+y) 


class second: 
    def __init__(self): 
     self.value_one = 3 
     self.value_two = 1 

しかし、それはニシキヘビを見ていない任意のより良いありそれを行う方法?また

def sum(self, cls): 
    self.value_one += cls.value_one 
    self.value_two += cls.value_two 

私の第三のクラスが持つ可能性があります:私は簡単なことでしたが、マッシーのコードのように一つ一つを追加したくないので、

私のクラスには、10の以上の属性を持っています

class ClassB: 
    def __init__(self): 
     self.value_one = 2 
     self.value_third = 3 

私はまた、あなたが使用してそれを短くすることができ、私の最初のクラスに

+0

[クラス間で変数にアクセスするにはどうすればよいですか?](http://stackoverflow.com/questions/19993795/how-would-i-access-variables-from-one-class-to-別のもの) – user2925795

+0

単純な解決策は、これらの2つの属性を提供する共通基本クラスを持ち、新しい属性を追加するサブクラスとして 'first'を持つことです。基本的に 'second'を' first'の親クラスにし、 'sum_class'メソッドを' second'に移動します。より具体的な例がなければ、この解決策が意味をなさないかどうかは明らかではありません。 – Bakuriu

+0

@ user2925795私は実際にclassA .__ dict__ + classB .__ dict__のようなものを探しています。それはちょうど私がすべてを追加したいいくつかの属性を合計します。 – ihsancemil

答えて

1

あなたが探しているものに似behvaiourを持っている唯一のクラスがです:あなたはこのようにそれを使用することができます10クラス:

>>> c = Counter() 
>>> c['a'] = 1.0 
>>> c + Counter('a') 
Counter({'a': 2.0}) 

ですから、Counter内でこれらの「属性」を記憶し、通常の属性アクセスに使用する__getattr__を使用することができます。

from collections import Counter 


class ClassWithCounter: 
    def __init__(self, **kwargs): 
     self.counter = Counter(kwargs) 

    def __getattr__(self, attr): 
     # this allows to use the syntax: first().value_one 
     try: 
      return self.counter[attr] 
     except KeyError: 
      raise AttributeError(attr) 

class first(ClasswithCounter): 
    def __init__(self): 
     super(first, self).__init__(value_one=2, value_two=5, value_third=7) 


    def sum_class(self, cls): 
     self.counter += cls.counter 


class second(ClassWithCounter): 
    def __init__(self): 
     super(second, self).__init__(value_one=3, value_two=1) 

注しかしCounterの目的はただへであること物事、それはあなたに奇妙な結果を与えるいくつかの状況があるかもしれません。

このような場合は、独自の辞書のようなクラスを実装してCounterの代わりに使用するだけです。


また、あなたはゲーム用にこれを書いているので、この種のアップデートが良いかどうかを検討する必要があります。このようにして、元の「基本値」は失われます。

私は個人的には「基本値」を別々にして、そのような値(例:アイテムや一時的な効果によって提供されるボーナスや悪意のあるもの)に対する「修飾子」を追跡します。 "この呪文のダメージはボーナスアーマーの影響を受けません"のようなものを実装することができます(ダメージを計算する際に基本値を使用するだけです)。あなたの現在のアプローチはこれをより面倒にします。

-1

を、このクラスを追加することにしたい:

def sum_class(self, cls): 
    [setattr(self, attr, getattr(cls, attr) + getattr(self, attr)) for attr in cls.__dict__] 

編集1:

あなたが何を望むかは不明だったが、コメントにあなたは悲しいした後、あなたはclassA.__dict__ + classB.__dict_のような何かをしたい、多分あなたは、この使用することができます:クラスはそのように定義されている場合

class sum_class: 
    def __init__(self, class_1, class_2): 
     self.sum = class_1.__class__() 
     self.class_2 = class_2 
     for attr in self.class_2.__dict__: 
      if attr in self.sum.__dict__: 
       setattr(self.sum, attr, getattr(self.class_2, attr) + getattr(self.sum, attr)) 
      else: 
       setattr(self.sum, attr, getattr(self.class_2, attr)) 

class first: 
    def __init__(self): 
     self.value_one = 2 
     self.value_two = 5 
     self.value_third = 7 #second class don't have that attribute 

    def __add__(self, cls): 
     return sum_class(self, cls).sum 

class second: 
    def __init__(self): 
     self.value_one = 3 
     self.value_two = 1 

    def __add__(self, cls): 
     return sum_class(self, cls).sum 

>>> f = first() 
>>> s = second() 
>>> x = f + s 
>>> x.value_one 
5 
>>> x.value_two 
6 
>>> x.value_third 
7 
+0

私の答えが間違っていることを知っているといいでしょう – ands

関連する問題