Как я могу создать объект дочернего класса внутри родительского класса? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть этот код в test.py:

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

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

И этот другой в test2.py:

from test import Parent

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

obj1 = Child()
obj2 = obj1.duplicate()
obj2.myprop1 = "another"
obj2.myprop2 = "stuff"

# Accessing properties
print("obj1, ", obj1.myprop1, ", ", obj1.myprop2)
print("obj2, ", obj2.myprop1, ", ", obj2.myprop2)
# Using Child method
print("obj1,", str(obj1))
print("obj2,", str(obj2))

Запуск test2.py, вывод:

obj1, some, thing
obj2, another, stuff
obj1, some, thing
obj2, <test.Parent object at 0x7fc1558e46d8>

Интересно, смогу ли я создать экземпляр Child внутри Parent, но поскольку там может быть больше потомков, я хочу знать класс self и создать экземпляр этого одного класса, скопируйте атрибуты и затем верните копию объекта.

Цель этого кода - вывести это:

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

Это означает, что obj2 является дочерним объектом, а не родительским объектом.

Надеюсь, это понятно, спасибо!

РЕДАКТИРОВАТЬ : я не хочу использовать copy.copy() или copy.deepcopy(). Если вы хотите получить только копию и реализовать более простое решение, отметьте Комментарий Моберга , чтобы увидеть другой связанный вопрос, использующий эти функции. Но этот вопрос предназначен для того, чтобы получить другой способ сделать это, а также узнать, как получить класс из объекта и получить другой экземпляр этого же класса. В этом конкретном случае показаны отношения родитель-ребенок между классами, которые я добавил, чтобы показать весь контекст моих сомнений.

Ответы [ 4 ]

1 голос
/ 06 апреля 2020

Просто не кодируйте класс жестко, используйте type для извлечения класса экземпляра, например:

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 голосов
/ 06 апреля 2020

Метод класса может быть лучше, так как он дает вам контроль над типом создаваемого объекта.

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 голосов
/ 06 апреля 2020

Да, используйте type(self), чтобы получить тип объекта. Также подумайте о реализации дублирования с методом dunder __copy__ для поддержки встроенного copy().

def __copy__(self):
    return type(self)()
0 голосов
/ 06 апреля 2020

Для создания экземпляра в duplicate вы можете использовать:

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

Но лучше решение будет использовать copy.copy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...