2012-02-17 18 views
3

ここで私が解決しようとしているコーディングの問題は...私は基本クラスを持っています、Animalと言うと、DogクラスとCatクラスという2つのサブクラスがあります。私のクラスAnimalには、makeとbabyの両方が継承するメソッドmake_baby()があります。私が問題を解決するのに苦労しているのは、戻り値を関数を呼び出すサブクラスの新しいインスタンスにしたいが、異なる属性値を持つ、つまりDog.make_baby()は新しいDogとCat.make_baby( )は新しい猫を返します。Pythonクラス:基本クラスのメソッドでの変数サブクラスの作成

以前は "type(self)()"を返そうとしましたが、type()はクラスではなく型オブジェクトを返すので、これは良くありません。ここで

は、完全なサンプルコードです:アイデアはメソッドが返さ以外まったく同じであるということですので、

Class Animal(): 
    def __init__(self, color): 
    self.color = color 
    def make_baby(): 
    new_color = rand_color # a randomly chosen color 
    return #??? new class of the same type that called the method 

Class Dog(Animal): 
    def pet(): 
    print '*pant*' 

Class Cat(Animal): 
    def pet(): 
    print 'purrr' 

だから私は犬と猫のためのmake_baby()メソッドを書き込まないようしたいのですがクラス。また、Animalにいくつかのサブクラスを作成したいので、if文をたくさん避けたいと思います。

答えて

10

あなたが書いた:タイプ()型オブジェクトではなく、クラスを返すので

これは良いではありません。

Aタイプは、新しいスタイルのクラスを使用している場合は、クラスです。 Python 3を使用している場合は、設定されています。すべてのPython 3クラスは「新しいスタイル」です。 Python 2.xを使用している場合は、object(または、Pythonの組み込みの型のようにオブジェクトから派生したもの)からクラスを派生させてください。

しかし、ここで本当にしたいのは、自動的に渡されたクラスへの参照を取得するクラスメソッドです。

class Animal(object): 

    def __init__(self, color): 
    self.color = color 

    @classmethod 
    def make_baby(cls): 
    return cls(rand_color) # randomly-chosen color 

、クラス(例えばAnimal.make_baby()又はDog.make_baby())またはインスタンス上でそれを呼び出すことができます。どちらの方法でも、メソッドは最初の引数としてクラスを受け取ります。

+0

ありがとう!これは実際に私の実際のコードが型(self)(...)の使用に取り組んでいたので実際にはうんざりしていましたが、それは不可解に機能しなくなりました。私はそれが私の基底クラスがもともとリストのサブクラスであったので、私はそれを削除し、親クラスなしでそれを残したので意味がないと判断したことに気づいた。私はオブジェクトを親クラスとして追加し、それは再び動作します!あなたが作った@classmethodの提案で遊ぶつもりです。それは滑らかなアイデアのようです。再度、感謝します。 – ampron

+2

インスタンスが必要な場合、クラスメソッドは適切ではありません。遺伝学が関与する場合。そのような場合は、動的なタイピングによって、瞬きを防ぐ自然な方法はありません。何を言っているのか忘れてしまいます。 –

+1

@KarlKnechtel:あなたはPythonのよく知られた "f \ * ck typing"を参照しているに違いありません。 – kindall

3

type()は全く新しいクラスを構築するために使用できます。何が欲しいのです:

class Animal(): 
    def __init__(self, color): 
    self.color = color 

    def make_baby(self): 
    new_color = rand_color # a randomly chosen color 
    return self.__class__(new_color) 
+0

旧式のクラス、yuck。 'type(instance)'はnew-styleのクラスを返します。 –

+0

もちろんPython 3を使用しているのでなければ、彼ははっきりとはありません。 –

3

あなたはアプローチが完全に機能します!ちょうど新しいスタイルクラスを使用してください。

Class Animal(object): 
    def __init__(self, color): 
    self.color = color 
    def make_baby(self): 
    new_color = rand_color # a randomly chosen color 
    return type(self)(new_color) 

Class Dog(Animal): 
    def pet(): 
    print '*pant*' 

Class Cat(Animal): 
    def pet(): 
    print 'purrr' 

make_baby(self)selfの詳細に頼らないある場合は、あなたがしたいことは、@ Kindall氏の答えのように、クラス全体のファクトリメソッドです。

関連する問題