1
votes

Comment corriger une erreur d'attribut dans la classe Python

Je ne fais que commencer dans les classes Python, et je me demande pourquoi mon attribut "weapon_condition" dans cette classe génère une erreur qu'il ne peut pas accéder / définir, disons, Weapon.name (). Je sais que j'ai encore beaucoup à apprendre avec les cours en général, alors excuses si c'est une erreur de débutant. Toute aide serait appréciée. Je ne sais pas non plus pourquoi la moitié de mon code s'affiche en dehors de la zone de code en direct ... est-ce que je poste ce mal?

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))


5 commentaires

Rappelez-vous comment vous avez fait référence à ces attributs dans __init__ ? Cela n'impliquait pas d' Weapon ni de parenthèses.


@imposeren Il y a plus d'erreurs que cela, mais un tutoriel est un bon conseil.


Lorsque vous posez des questions sur le code qui produit une exception, incluez toujours le suivi complet dans la question. Copiez le Traceback et collez-le dans la question, puis formatez-le sous forme de code (sélectionnez-le et tapez ctrl-k)


Mise en forme des articles ... Aide au formatage


Il est d'usage de choisir une réponse comme «acceptée» ici, après que tout le monde vous aide.


3 Réponses :


2
votes

Vous souhaitez créer une instance de la classe Weapon, puis accéder à ses attributs ou méthodes en utilisant .attribute ou .method() .

Dans les méthodes, vous souhaitez utiliser self et non le nom de la classe.

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'.


2 commentaires

time = self.time ne fonctionnera pas car l'objet n'a pas d'attribut time .


Bonne prise, nous l'ajouterons.



1
votes

weapon_condition est une méthode d'instance. Vous l'appelez sur une instance (telle que sword_1 ), pas sur une classe (telle que Weapon ).

Par exemple: print(sword_1.weapon_condition()) fera exactement ce que vous voulez, car maintenant vous appelez cette méthode d'instance sur une instance, en utilisant la syntaxe normale pour appeler une méthode d'instance sur une instance.

Vous devez avoir une compréhension claire de ce qu'est une classe, de ce qu'est une instance de classe, de ce qu'est une méthode d'instance et de la manière dont ces éléments sont déclarés et utilisés, au moins dans votre propre code. Vous ne pouvez pas simplement utiliser une classe et une instance de manière interchangeable. Ce n'est pas la même chose.


0 commentaires

0
votes
class Weapon:
    def __init__(self, name, wtype, damage, time, wear_rate):
        self.name = name
        self.wtype = wtype
        self.damage = int(damage)
        self.wear_rate = float(wear_rate)
        self.time = int(time)
        self.condition = self.time * self.wear_rate

    def weapon_condition(self):
        # Add whatever time() function to the class Weapon, this is just arbitrary
        if self.condition >= self.damage * 0.8:
            # print(self.name + ' is in good condition.')
            return self.name + ' is in good condition.'
        elif self.damage * 0.8 > self.condition >= self.damage * .3:
            # print(self.name + ' needs work.')
            return self.name + ' needs work.'
        elif self.condition < self.damage * 0.3:
            # print(self.name + 'is almost broken.')
            return self.name + 'is almost broken.'


sword_1 = Weapon('Bloodsword', 'sword', 48, 120, 0.16)
print(sword_1.name)
print(sword_1.wtype)
print(sword_1.damage)
print(sword_1.weapon_condition())
So, several things jumped out here. 
First, you have to instantiate variables (attributes) in your _init__ function so they can be used in the scope of the parameterized class. 
Second, check your calculations in your methods or you might not get the expected results. 
Third, watch for argument variable names that mirror built-ins. 
Fourth, make sure your attributes specify appropriate types for the inputs, i.e.int, float, etc. 
Fifth, assigning a variable to a class object allows you to call whatever methods the class contains on that assigned variable, not just attributes (class variables).if variable = class 
then variable.class_method() is callable

0 commentaires