如何修复Python类中的属性错误

时间:2019-05-03 23:53:14

标签: python class oop

我才刚开始使用Python类,并且想知道为什么我在此类中的“ weapon_condition”属性会出现一个错误,它无法访问/定义,例如Weapon.name()。我知道一般来说我的课程还有很多要学习的地方,因此如果这是一个初学者的错误,我们深表歉意。任何帮助,将不胜感激。还不确定为什么我的一半代码显示在实时代码区域之外...我发错了吗?


class Weapon:
    def __init__(self, name, type, damage, time, wear_rate):
        self.name = name
        self.type = type
        self.damage = damage
        self.wear_rate = wear_rate

    def weapon_condition(self):
        name = Weapon.name()
        damage = Weapon.damage()
        wear_rate = Weapon.wear_rate()
        time = Weapon.time()
        condition = time*wear_rate
        if condition >= damage * 0.8:
            return name + ' is in good condition.'
        elif 0.8 > condition >= 0.3:
            return name + ' needs work.'
        elif condition < 0.3:
            return name + 'is almost broken.'

sword_1 = Weapon('Bloodsword', 'sword', 48, 120, 0.16)

print(sword_1.name)
print(sword_1.type)
print(sword_1.damage)

print(Weapon.weapon_condition(sword_1))

2 个答案:

答案 0 :(得分:1)

您要创建武器类的实例,然后使用.attribute.method()访问其属性或方法。

在方法内部,您要使用self而不是类的名称。

class Weapon:
    def __init__(self, name, type, damage, time, wear_rate):
        self.name = name
        self.type = type
        self.damage = damage
        self.time = time
        self.wear_rate = wear_rate

    def weapon_condition(self):
        name = self.name # self not Weapon
        damage = self.damage # self not Weapon
        wear_rate = self.wear_rate # self not Weapon
        time = self.time # self not Weapon
        condition = time*wear_rate
        if condition >= damage * 0.8:
            return name + ' is in good condition.'
        elif 0.8 > condition >= 0.3:
            return name + ' needs work.'
        elif condition < 0.3:
            return name + 'is almost broken.'

sword_1 = Weapon('Bloodsword', 'sword', 48, 120, 0.16)

print(sword_1.name) # Print sword_1's attribute.
print(sword_1.type) # Print sword_1's attribute.
print(sword_1.damage) # Print sword_1's attribute.
print(sword_1.weapon_condition()) # Print the result returned by sword_1's method named 'weapon_condition'.

答案 1 :(得分:1)

weapon_condition是一个实例方法。您可以在实例(例如sword_1)上调用它,而不是在类(例如Weapon)上调用它。

例如:print(sword_1.weapon_condition())会完全满足您的要求,因为现在您正在使用实例上的常规语法在实例上调用实例方法。

至少在您自己的代码中,您需要清楚地了解什么是类,什么是类实例,什么是实例方法以及如何声明和使用这些东西。您不能仅将类和实例互换使用。他们不是一回事。