0
votes

Comment puis-je créer un objet d'une classe enfant dans la classe parent?

J'ai ce code dans Test.py:

obj1, some, thing
obj2, another, stuff
obj1, some, thing
obj2, another, stuff


4 commentaires

En côté, pourquoi ne pas parent .__ init __ prenez des paramètres?


Est-ce que cela répond à votre question? Comment puis-je créer une copie d'un objet dans Python?


@chepner merci d'avoir demandé, voulez-vous dire mettre les littéraux de chaîne comme arguments au constructeur enfant pour que Parent .__ init__ prenne et attribue cela? Si tel est le cas, c'est parce que je veux savoir comment créer une instance d'une classe enfant dans la classe parent, et j'ai créé ce code simple pour montrer ce problème particulier et le contexte le minimum possible.


@Moberg merci pour votre commentaire et c'est une bonne alternative. Bien que cela remplace la méthode duplicate () , et je voulais savoir comment cela pourrait être fait sans utiliser copy () ou deepcopy () , parce que les deux ne fonctionnaient pas pour moi dans le code sur lequel je travaille actuellement. Je vais donc modifier la question pour ajouter que je ne veux pas utiliser de copie ou de copie profonde. Merci! :)


4 Réponses :


1
votes

Ne codez simplement pas la classe en dur, utilisez type pour récupérer la classe de l'instance, quelque chose comme:

class Parent(object):
    def __init__(self):
        self.myprop1 = "some"
        self.myprop2 = "thing"

    def duplicate(self):
        cls = type(self)
        copy = cls()
        copy.myprop1 = self.myprop1
        copy.myprop2 = self.myprop2
        return copy


0 commentaires

0
votes

Pour créer l'instance en duplicate , vous pouvez utiliser:

def duplicate(self):
    copy = type(self)()
    ...

Mais une meilleure solution serait d'utiliser copy.copy


0 commentaires

0
votes

Oui, utilisez type (self) pour obtenir le type de l'objet. Pensez également à implémenter la duplication avec la méthode dunder __copy__ pour prendre en charge la copy().

def __copy__(self):
    return type(self)()


1 commentaires

Merci! Je remplacerai duplicate () et utiliserai __copy __ () à la place



0
votes

Une méthode de classe pourrait être meilleure, car il vous donne un contrôle sur le type d'objet créé.

class Parent(object):
    def __init__(self):
        self.myprop1 = "some"
        self.myprop2 = "thing"

    @classmethod
    def from_object(cls: 'T', obj: Parent) -> 'T':
        copy = cls()
        copy.myprop1 = obj.myprop1
        copy.myprop2 = obj.myprop2
        return copy


class Child(Parent):
   def __str__(self):
        return "{}, {}".format(self.myprop1, self.myprop2)


obj1 = Child()
obj2 = Child.from_object(obj1)  # A new Child
obj3 = Parent.from_object(obj1)  # A new Parent


0 commentaires