2016-08-17 14 views
1

だから私はpythonで子クラスを構築する方法を理解しようとしています。Pythonクラスで継承を理解する

ので、最終的な結果は、私は、これらの機能をしたいです

from abc import ABCMeta, abstractmethod 

class Persion(object): 
    __metaclass__ = ABCMeta # sets the metaclass to a abstract base class . that means we never call this class directley insted its used for child classes to inhearrit 
    def __init__(self, name, gender): 
     self.name = name 
     self.gender = gender 

    def talk(self): 
     print("hi my name is " + self.name + " and I am a " + self.gender + ".") 

    @abstractmethod 
    def PersionType(self): 
     """Returns a string of the childs type""" 
     pass 

class Player(Persion): 
    def __int__(self,speed): 
     self.name = name 
     self.gender = gender 
     self.speed = speed 
     self.posX = 0 
     self.posY = 0 

    def moveXY(self, X, Y): 
     self.posX = X 
     self.posY = Y 

    def PersionType(self): 
     return 'Player' 

player=Persion("Ben","m") 
hero = Player(player,30) 
hero.moveXY(20,20) 
print("you are now at ", hero.posX, "," , hero.posY) 
print("your speed is ", hero.speed) 
print("your gender is ", hero.gender) 
hero.talk() 

ので、これは私の現在のコードであるので、IVEはperentと子クラスを作成しましたが、私はちょうどそれらが

を動作させるために方法を理解カント働く しかし、私は何かを見つけたいと思っている継承をbuildignで拾ってしまった。

hero.moveXY(20,20) 
print("you are now at ", hero.posX, "," , hero.posY) 
print("your speed is ", hero.speed) 
print("your gender is ", hero.gender) 
hero.talk() 

私はこれは私がinheratinceはpythonでどのように動作するかを理解するために作っています

line 36, in <module> 
    print("your speed is ", hero.speed) 
AttributeError: 'Player' object has no attribute 'speed' 

としてエラーsutchを取得イム。

答えて

2

あなたのコードで三つの主要な問題あります

  1. 変更__init__から__int__が。インスタンスが初期化されていないため、no attribute 'speed'エラーが発生します。

  2. サブクラス(この場合継承するクラス、この場合はPlayer)には、関連付けたいすべての引数を取る__init__メソッドが必要です。スーパークラス(Persion)が使用するものをスーパークラスの__init__に渡すことができます。それはおそらくに__init__方法を変更することを意味:インスタンスを作成するときに

    class Player(Persion): 
        def __init__(self, name, gender, speed): 
         super(Player, self).__init__(name, gender) 
         self.speed = speed 
         self.posX = 0 
         self.posY = 0 
    
  3. さて、あなただけのサブクラスのインスタンスを作成する必要があります。これらの変更により

    hero = Player('Ben', 'm', 30) 
    

、これらの行::

you are now at 20 , 20 
your speed is 30 
your gender is m 
hi my name is Ben and I am a m. 

追加の小さなノート

print("you are now at ", hero.posX, "," , hero.posY) 
print("your speed is ", hero.speed) 
print("your gender is ", hero.gender) 
hero.talk() 

は今、この出力を生成するには、スーパークラスからメソッドを継承します:

  • Persionではなく、Personという名前にすることをお勧めします。
  • @abstractmethodメソッドは必要ありません。
+0

ご説明いただきありがとうございます。私はそれがスペルミスのような単純なものだとは気付かなかった。 それはセーションを作るが、私はまだ完全にラインスーパー(Player、self).__ init __(名前、性別)を理解していません 私はそれが何をしているのかについて大まかなアイデアを得る。夕食会/親クラスから値を設定するが、私はこのsuper()関数が何をしているのかをはっきりと理解していない。 – skyzzle