2012-04-10 9 views
0

私はPythonを学ぶためのミニゲームを書いています。 main.pyファイルにインポートできる武器クラスを作成しました。ここでクラスメソッドがPython 2.7.1で間違った数値を返す

は私が作ったクラスです。ここ

class weapon(object): 

    def __init__(self, name): 
     self.weaponName = name 

    def weaponStrength(self, level, strength): 
     self.weaponLevel = level 
     self.weaponStrength = strength 
     damage = self.weaponStrength * level 

     print "Damage is equal to %r" % damage 

     return damage 

は武器クラスを使用して作成されたオブジェクトです。

# Creates an Object called sword using the weaponsClass 
sword = weapon("sword") 

# Calls a method of the weaponsClass to calculate weapon Strength. Returns a int 
sword.weaponStrength(3, 20) 

# Creates an Object called Magic Staff using the weaponsClass 
magicStaff = weapon("Magic Staff") 

# Calls a method of the weaponsClass to calculate weapon Strength. Returns a int 
magicStaff.weaponStrength(5, 30) 


# Sets a variable 
swordStrength = sword.weaponStrength 

# Sets a variable 
magicStaffStrength = magicStaff.weaponStrength 

# Prints the variable 
print swordStrength 

# Prints the variable 
print magicStaffStrength 

私はswordStrengthとmagicStaffStrengthは、メソッドに渡された強度値に等しい理由を把握しようとしています。

ご迷惑をおかけして申し訳ありません。

ありがとうございました。あなたはweapon名前空間にweaponStrengthを上書きしている

+1

にサイドノート方法を分割することをお勧めしたい:そのより保守をし、 weaponStrength()関数から別の副作用にきれいにします。つまり、weaponStrength()はダメージ()のようにリターンされるべきで、print関数はすべて削除する必要があります。これはあなたのself.weaponStrength属性があなたのself.weaponStrength()関数と同じ名前であるという事実を緩和するのに役立ちます。 – hexparrot

+1

ここであなたの構造を考えれば、強さとレベルを設定する 'set_characteristics'関数と、ダメージを受ける' get_damage'関数があることを指摘しておきます。あるいは、特性が設定された後に変更されることを意図していない場合、 'set_characteristics'呼び出しで設定されたストレートメンバー変数を持つことができます。 –

+0

@hexparrot swordStrength変数を設定すると間違っていたので、値を表示するためにprint関数をそこに配置しました。私はそれを削除し、sr2222によって言及された変更を行うつもりです。ご意見をいただきありがとうございます。 – TDNS

答えて

6

self.weaponStrength = strength 

def weaponStrength(...): 

は実際に矛盾しています。以来、被害

私はこれは悪いデザインだと思います

を計算して返すweaponLevelとweaponStrength

保存

:たぶん、このメソッドは、2つのことを行うしようとしている

+0

私に明確で簡潔な答えをくれてありがとう。 – TDNS

0

あなたの命名規則について考えます最初の目的は、関数がsetWeaponLevelAndStrengthのように呼び出されるべきであり、2番目の関数がcalculateDamageと呼ばれるべきであることを示唆しています。 weaponStrengthは明らかに名前の恐ろしい選択をするあなたも

def weaponStrength(self, level, strength): 
    self.weaponLevel = level    #first purpose 
    self.weaponStrength = strength   #first purpose 
    damage = self.weaponStrength * level #second purpose 

    print "Damage is equal to %r" % damage #second purpose 

    return damage 

その名前の属性を持っているしたい場合、私はあなたが2

def setWeaponLevelAndStrength(self, level, strength): 
    self.weaponLevel = level 
    self.weaponStrength = strength 

def calculateDamage(self) 
    damage = self.weaponStrength * self.weaponLevel 

    print "Damage is equal to %r" % damage 

    return damage 
+0

あなたはまったく正しいです。クラスのメソッドではなくクラスのメソッドを作成して、2つのクラスをクリーンアップします。あなたのご意見に感謝します。 – TDNS

関連する問題