2016-09-18 9 views
1

次のように私は(継承を練習)私のPythonプロジェクトのために、次のファイル/フォルダの設定を持っている:Pythonで継承を実践する:クラスと属性が正しく設定されているにもかかわらず、なぜAttributeErrorですか?

my_project/new_classes.py 
my_project/human/Human.py 
my_project/human/__init__.py (note, this is a blank file) 

それは私のclass Samurai(Human)が正しくセットアップされているように見えますが、私は次のエラーを受信して​​います:

from human.Human import Human 
class Wizard(Human): 
    def __init__(self): 
     super(Wizard, self).__init__() 
     self.intelligence = 10   
    def heal(self): 
     self.health += 10 
class Ninja(Human): 
    def __init__(self): 
     super(Ninja, self).__init__()  
     self.stealth = 10     
    def steal(self): 
     self.stealth += 5 
class Samurai(Human): 
    def __init__(self): 
     super(Samurai, self).__init__() 
     self.strength = 10    
    def sacrifice(self): 
     self.health -= 5 
# create new instance of Wizard, Ninja, and Samurai 
harry = Wizard() 
rain = Ninja() 
tom = Samurai() 
print harry.health 
print rain.health 
print tom.health 
harry.heal() 
print harry.health 
rain.steal() 
print rain.stealth 
tom.sacrifice() 
print tom.health 
print tom.stealth 

コードブレーク:ここ

line 41, in <module> 
tom.sacrifice() 
AttributeError: 'Samurai' object has no attribute 'sacrifice' 

は私のmy_project/new_classes.pyファイルからのコードですそれはラインtom.sacrifice()になる - 任意のアイデアなぜですか?私が持っていた

もう一つの問題は、親クラスをインポートしようと、私は式がmodule_directory import ModuleFileNameからだと思ったとして、私は(私は仕事だろうと思った声明from human import Humanを、使用していたが、次のようにエラーを受け取ったとき、最初にありました:。?TypeError: Error when calling the metaclass bases module.__init__() takes at most 2 arguments (3 given)私は正しくクラスをインポートについて混同されることが、にfrom human.Human import Humanを私のimport文を変更し、他はなかったが、これは働いていた理由を思っていたことで、これを解決し、誰も明確に助けることができるかもしれない期待していた

[編集]削除されたコメント

+1

'Human'の定義は何ですか?それは新しいスタイルのクラスですか? – DeepSpace

+1

[MCVE]にトリムすることはできませんか? –

+0

'human'クラスを提供できるので、実行できますか? – noumenal

答えて

1

I resolved this by changing my import statement to, from human.Human import Human and was wondering why this worked while the other did not?

これは、最初の「人間」がPythonモジュール(Human.py)であるためです。ヒューマンクラスはその内部にあるので、あなたのインポートステートメントは、最後に書いたものでなければなりません。モジュールをインポートするのではなく、そのクラスをインポートします。

あなたのAttributeErrorの問題に関しては、あなたのクラスが問題ないと思われるので、それは奇妙です。おそらくHumanクラスの中では珍しいものです。その中にコードを入れることはできますか?私は私が唯一の第二の問題のため答えを残しておきますので、あなたはAttributeError問題の解決策を見つけた参照

EDIT

+0

これはまさに私が不思議に思っていたものです。要約すると、human.HumanはHuman.pyからHuman.pyを取得します。最後のコマンドは、人間が最終的にクラスをインポートします。モジュール内の人間...これは私の理解で正しいですか?見ていただき、ありがとうございました。間違いなくスペースの問題になってしまいました。自己への注意:Pythonがタブ固有であるため、コピーされ貼り付けられたコードのタブフォーマット/スペースフォーマットを常にチェックしてください!ルーカスありがとう! – natureminded

+1

これは100%正しいです。 'human'がディレクトリで、最初の' Human'がファイルで、2番目の 'Human'が最終的にインポートしたいクラスです。私は助けることができてうれしいよ – lucasnadalutti

0

同じドキュメントでクラスを初期化すると、以下のコードが実行されます。このエラーが発生する理由は、初期化中に設定されていない変数を変更しようとしているためです。

class Human(object): 
    def __init__(self): 
     self.health = 100 
     self.stealth = 0 
     self.strength = 15 

変数を初期化する必要があります。 Humanには、変更するプロパティがあることを確認してください。おそらく=を正常に設定できますが、初期化されていない場合は-=5に変更されません。

+0

私は 'from human.Human import Human'がHumanクラスをインポートし、__init__メソッドを実行する必要があると信じています!あなたの答えと助けてくれてありがとう! – natureminded

0

私の解決策は、私のサムライの方法では、私は間隔の問題があった!

私のコードを適切なタブで再フォーマットして、すべてが機能しています!次のように

正しいコードは次のとおりです。

class Samurai(Human): 
    def __init__(self): 
     super(Samurai, self).__init__() # use super to call the Human __init__ method 
     self.strength = 10    # every Samurai starts off with 10 strength 
    def sacrifice(self): 
     self.health -= 5 
関連する問題