Ce sera ma première question sur ce site. Si je me trompe sur l'anglais, désolé. Okey, ma question est de savoir comment puis-je ajouter ou définir un attribut à la méthode de classe depuis une classe extérieure? Si je ne me trompe pas,...

0
Berke Balcı 14 mars 2021 à 20:10

4 réponses

Meilleure réponse

Comme @Julian Fock l'a mentionné, vous pouvez ajouter des attributs à un objet en écrivant simplement des instructions, telles que person.age = 19. Votre instance / objet de la classe sss-Person aurait désormais cet attribut, mais pas la classe elle-même.

Pour modifier la classe sss-Person elle-même, vous auriez besoin d'implémenter des méthodes laides, qui seraient étiquetées comme "hacky" ou "mauvaises pratiques" par la plupart des programmeurs. Les entreprises peuvent refuser d'accepter le code comme valide. Vous devriez plutôt envisager d'utiliser d'autres méthodes telles que class inheritance, où vous pouvez dériver une classe modifiée en ajoutant des fonctionnalités plus avancées.

Néanmoins, la modification d'une définition class peut être utile pour le débogage ou les urgences exceptionnelles. Dans ce cas, vous pouvez définir des fonctions externes et les lier pour remplacer vos méthodes de classe comme suit:

# A) Initial Analysis

class Person:
   def __init__(self,name,surname):
       self.name    = name
       self.surname = surname
   def method1(self):
       a = "Python"

person1 = Person("Adam","Roger")
person2 = Person("Adam","Roger")

person1.age = 19

print(person1.age)
# Output: 19

# print(person2.age)
# AttributeError: 'Person' object has no attribute 'age'

# B) Change class attributes

def __init2__(self, name, surname, age):
    self.name    = name
    self.surname = surname
    self.age     = age

Person.__init__ = __init2__

person3 = Person("Adam","Roger", 20)

print(person3.age)
# Output: 19

# person4 = Person("Adam","Roger")
# TypeError: __init2__() missing 1 required positional argument: 'age'


# C) Overwrite method1

def method2(self):
    self.a = "Python"

Person.method1 = method2

person5 = Person("Adam","Roger",44)
person5.method1()
print(person5.a)
# Output: "Python"
0
C-3PO 14 mars 2021 à 17:48

Si vous instanciez votre classe avec par exemple person = Sss("Adam", "Roger") vous pouvez accéder et ajouter des attributs avec un point comme celui-ci:

person.age = 19

Exemple complet:

class Sss:
    # You should name your class with capital letter and without brackets
    def __init__(self, name, surname):
        self.name = name
        self.surname = surname


person = Sss("Adam", "Roger")
print(person.name) # access attribute

person.age = 19 # add attribute
print(person.age)
1
Julian Fock 14 mars 2021 à 17:22

Qu'est-ce que l'attribut "Âge" maintenant? Je veux dire est cet attribut de classe ou quoi?

Age est maintenant une variable d'instance sur votre instance de sss nommée object.

Comment puis-je ajouter un attribut à la méthode de classe?

Je ne sais pas ce que vous demandez ici.

0
Bill Lynch 14 mars 2021 à 17:13

PS: Je n'entrerai pas dans le mérite de savoir s'il est recommandé de faire des choses que je vais illustrer ici.

Ajout à la réponse de Bill Lynch

Qu'est-ce que l'attribut "Âge" maintenant? Je veux dire est cet attribut de classe ou quoi?

L'âge est maintenant une variable d'instance sur votre instance d'objet nommé sss.

PS: N'utilisez pas object car c'est un mot-clé en python.

Quelle est la valeur de l'attribut "Âge" maintenant?

La valeur est de 19.

Je veux dire est cet attribut de classe ou quoi?

C'est un attribut de l'instance que vous avez créée à partir de la classe, et uniquement pour cette instance.

comment puis-je ajouter un attribut à la méthode de classe?

Si vous souhaitez ajouter l'attribut à la classe afin que chaque instance ait un nouvel attribut de votre choix, vous pouvez le faire:

    setattr(sss, 'b', 'Python')

    obj1 = sss("Adam", "Roger")
    print(obj1.b)

    obj2 = sss("Adam", "Roger")
    print(obj2.b)

    obj2.b = "New"

    print(obj1.b) # will still be Python
    print(obj2.b) # now will be New

Si vous souhaitez remplacer method1 par une nouvelle méthode:

    sss_obj = sss("Adam", "Roger")

    def method1(self):
        self.b = 'New'

    setattr(sss, 'method1', method1)

    print('Should be False because the instance has no b attribute yet.', hasattr(sss_obj, 'b'))

    sss_obj.method1()

    print('Now it has and b value is', sss_obj.b)

Si vous souhaitez modifier la méthode sur une instance spécifique de la classe sss:

    sss_obj = sss("Adam", "Roger")
    sss_obj2 = sss("Adam", "Roger")

    def method1():
        sss_obj2.b = 'New'

    setattr(sss_obj2, 'method1', method1)

    sss_obj.method1()
    print('Should be False because method1 from instance sss_obj does not set b.', hasattr(sss_obj, 'b'))

    sss_obj2.method1()
    print('Now on instance 2 the b value is', sss_obj2.b)

Si vous souhaitez modifier la source de la méthode sous forme de chaîne par programme:

    sss_obj = sss("Adam", "Roger")

    new_method_source = 'self.b = "NotRecommended"\n' \
                        'print("Got into changed method")'

    def method1(self):
        return exec(
            compile(new_method_source, '', mode='exec'),
            None,
            {
                'self': self
            }
        )

    setattr(sss, 'method1', method1)

Si vous voulez changer le code de method1, commencez par saisir la source avec la ligne suivante

method1_src = inspect.getsource(sss_obj.method1)

Ensuite, changez la chaîne comme vous le souhaitez et faites une chose similaire à celle mentionnée précédemment (compiler et trucs).

À votre santé

0
Tonsic 14 mars 2021 à 18:40