J'ai ce code dans Test.py:
obj1, some, thing obj2, another, stuff obj1, some, thing obj2, another, stuff
4 Réponses :
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
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
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)()
Merci! Je remplacerai duplicate () et utiliserai __copy __ () à la place
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
En côté, pourquoi ne pas
parent .__ init __ code> 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 utilisercopy ()oudeepcopy (), 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! :)