2011-11-10 5 views
2

における継承とデフォルト値は、私はそうと、一般的な__init__値を持つクラスを作るが、そのサブクラスのデフォルトを持ってしようとしています:Pythonの:__init__

class Enemy: 

def __init__(self, difficulty, power, MaxHP, magic, MaxMP, speed, name): 
    self.power = power + 2*difficulty 
    self.HP = self.MaxHP = MaxHP + 5*difficulty 
    self.magic = magic + 2* difficulty 
    self.MP = self.MaxMP = MaxMP + 5*difficulty 
class Goblin(Enemy): 
def __init_(self, difficulty = 1, power = 1, MaxHP = 5, magic = 1, MaxMP = 5, speed = 5, name = "Goblin"): 
    super(Goblin, self).__init__(self, power, MaxHP, magic, MaxMP, speed, name) 

をしかし、私はゴブリンのオブジェクトを作成しようとすると、残りのデフォルト値が与えられているにもかかわらず、完全な8つの引数が必要だと私に伝えます。私がそれをすることができない理由があるのですか、私はここで何か間違っていますか?

+3

ゴブリンの '__init__'のアンダースコアがありません。そのため、問題の原因となっているコードをコピーして貼り付ける必要があります。そして完全なトレースバックも。 Pythonのトレースバックは通常とても役に立ちます。 –

答えて

3

difficultyなしで呼び出したためです。 class Enemy(object)のように継承して、2.xになっている場合はEnemyが新しいスタイルのクラスであることを確認することをお勧めします(以前の方法ではsuperを使用していたはずです)。ここで

は単純な例です:

class Animal(object): 
    def __init__(self, talk): 
    print '__init__ Animal: ', talk 

class Cat(Animal): 
    def __init__(self, talk='meow'): 
    print '__init__ Cat' 
    super(Cat, self).__init__(talk) 

if __name__ == '__main__': 
    tom = Cat() 

出力:

__init__ Cat 
__init__ Animal: meow 

編集:

さて、次は動作しない場合は、おそらくあなたは、古いクラスを持っていますあなたのインタプリタにキャッシュされた定義(新しいインタープレター)。

class Enemy(object): 
    def __init__(self, difficulty, power, MaxHP, magic, MaxMP, speed, name): 
    self.power = power + 2*difficulty 
    self.HP = self.MaxHP = MaxHP + 5*difficulty 
    self.magic = magic + 2* difficulty 
    self.MP = self.MaxMP = MaxMP + 5*difficulty 
    print 'Raaarghh!! I am the formidable {}.'.format(name) 

class Goblin(Enemy): 
    def __init__(self, difficulty=1, power=1, MaxHP=5, magic=1, MaxMP=5, speed=5, name="Goblin"): 
    super(Goblin, self).__init__(difficulty, power, MaxHP, magic, MaxMP, speed, name) 

if __name__ == '__main__': 
    g = Goblin(name='user1038783 goblin') 
+0

ハ、あなたはあなたがすべてを試したと思うときに逃すもの。そして、オブジェクトの部分をありがとう。 – limasxgoesto0

+0

私はプログラムをもう一度(私のテストドライバーとは対照的に)実行しようとしましたが、難しかったとしても、同じエラーが出ます。 "TypeError:__init__は正確に8つの引数をとります.2" – limasxgoesto0

+0

OK、 '__init__暗黙的に行われるため、 'self'を明示的に渡しません。 – wim

0

このコードは、私の作品:

class Enemy(object): 
    def __init__(self, difficulty, power, MaxHP, magic, MaxMP, speed, name): 
     self.power = power + 2*difficulty 
     self.HP = self.MaxHP = MaxHP + 5*difficulty 
     self.magic = magic + 2* difficulty 
     self.MP = self.MaxMP = MaxMP + 5*difficulty 

class Goblin(Enemy): 
    def __init__(self, difficulty = 1, power = 1, MaxHP = 5, magic = 1, MaxMP = 5, speed = 5, name = "Goblin"): 
     super(Goblin, self).__init__(difficulty, power, MaxHP, magic, MaxMP, speed, name) 

私はそれが仕事を得るためにあなたを変更しなければならなかった方法:

  1. 修正がGoblinでをスペルミス。
    • 症状:ゴブリンは__init__メソッドを定義していなかったとして、それがobject
        から継承することで、新しいスタイルのクラスに変更 Enemy Enemy
    • からデフォルトなし1を継承していたのでGoblin()は、TypeError: __init__() takes exactly 8 arguments (1 given)を上げました
    • 症状:super()への電話でTypeError: must be type, not classobjを取得しました。古いバージョンのPythonがそれを許可したのか、それとも違うエラーを引き起こしたのか分かりませんが、古いスタイルのクラスは新しいスタイルのクラスとは違うMRO(メソッド解決順序)のルールを持っています。とにかく
  2. super(Goblin, self).__init__(self, ...)
    • 症状への呼び出しから2番目selfを削除します。selfが自動的super(Class, self).some_method(...)に渡されるので、そこに自分自身をそれを置くことEnemy.__init__(self, self, difficulty, power, ...)を呼ぶようなものです。コールへ
  3. 追加 difficulty症状
    • super(Goblin, self).__init__(...)に:あなたは難易度がGoblin.__init__に債務不履行になったが、その後Enemy.__init__までの値を渡しません。

そうだと思います。

+0

ああ、wimは__init__が間違っていると言いましたが、私はそれをチェックしたときに再び逃しました。お互いのおかげで、今働いています。 – limasxgoesto0

関連する問題