2017-08-24 12 views
0

私はクラスAnimalを持っており、特定の関数セットへのアクセスを許可する属性が必要です。メソッドを含むpythonクラス属性を実装する方法は?

class Animal(object): 
    def __init__(self, age): 
     self.age = age 

rex = Animal() 
rex.actions.bark() 
rex.actions.say_age() 

私はアクションクラスを作成し、多重継承とミックスインとしてそれを使用してみましたが、それはちょうど私がこれを行うことができます:

rex.say_age() 

これは私が欲しいものではありません。

また、静的メソッドでいっぱいのActionsクラスを作成しようとしましたが、これによってAnimalの属性がメソッドに渡されます。私はパンダを知っ

が、これは(Series.strは一例です)を実装し、それはそれがこれを行うにはニシキヘビの方法はある独自のオーバーヘッド

の多くを必要のように見えますか?

+0

*コンポジション*ノー継承を探しています。 –

答えて

3

コンストラクタでAnimalを受け取る別のクラスを作成してください。

class AnimalActions(object): 
    def __init__(self, animal): 
    self.animal = animal 

class Animal(object): 
    def __init__(self, age): 
    self.age = age 
    self.actions = AnimalActions(self) 
+0

クラスに第1クラスのインスタンスを含む第2クラスのインスタンスが含まれていることに問題はありませんか?無限にネストする属性を作成するようです。 – Alon

+1

'__del __()'(デストラクタ)メソッドがない限り、問題ありません。これは参照サイクルですが、Python GCはデストラクタメソッドが存在しない限り、それを処理できます。サイクル内のオブジェクトにデストラクタがある場合、 'gc.garbage'(https://docs.python.org/3.6/library/gc.html#gc.garbage)に終わります。 –

+0

また、「含んでいません。 "、それは単に"参照 "です。 'Animal'オブジェクトごとに、ちょうど1つの' AnimalAction'があります。それをメンバー/包含データではなく、お互いのポインタと考えることができます。 –

関連する問題