【问题标题】:class method returns wrong number in Python 2.7.1类方法在 Python 2.7.1 中返回错误的数字
【发布时间】:2012-04-10 19:49:03
【问题描述】:

我正在编写一个小游戏来学习 Python。我创建了一个可以导入到我的 main.py 文件中的武器类。

这是我制作的课程:

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 等于传递给方法的强度值。

非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 附注:将副作用与武器强度()函数分开,更易于维护和清洁。也就是说, WeaponStrength() 应该重命名为像 damage() 这样它返回的东西,并且应该完全删除 print 函数。这应该有助于缓解您的 self.weaponStrength 属性与您的 self.weaponStrength() 函数同名的事实。
  • 我还要指出,考虑到您的结构,您可能意味着有一个设置强度和级别的set_characteristics 函数,以及一个获得伤害的get_damage 函数。或者,如果特性在设置后不打算更改,您可以在 set_characteristics 调用中设置一个直接成员变量。
  • @hexparrot 我把 print 函数放在那里查看值,因为当我设置 SwordStrength 变量时它是错误的。我将删除它并进行 sr2222 提到的更改。感谢您的反馈。
  • @sr2222 你是对的。这将使它更清洁。感谢您的意见。

标签: python oop class methods


【解决方案1】:

您正在覆盖 weapon 命名空间中的 WeaponStrength:

self.weaponStrength = strength

def weaponStrength(...):

实际上是冲突的。也许考虑一下您的命名约定

【讨论】:

    【解决方案2】:

    这个方法试图做两件事:

    存储武器等级和武器强度

    计算和返回伤害

    我认为这是一个糟糕的设计,因为第一个目的表明该函数应该被称为setWeaponLevelAndStrength,而第二个目的表明它应该被称为calculateDamageweaponStrength 如果您还希望有一个具有该名称的属性,那么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
    

    我建议你将方法一分为二

    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
    

    【讨论】:

    • 你完全正确。我将通过为类创建方法而不是一个来清理它。感谢您的意见。
    猜你喜欢
    • 2011-04-24
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多