вернуть новый экземпляр текущего класса - PullRequest
0 голосов
/ 11 мая 2018

Я хотел бы вернуть новый экземпляр текущего класса, когда унаследованный класс возвратит, он возвратит базовый класс вместо текущего класса

class class1:
    def __init__(self):
        self.foo = 1
        self.bar = 2
    def new(self):
        return class1()

class class2(class1):
    def __init__(self):
        super().__init__()

c1 = class1()
c2 = class2()
print(c1.new())
print(c2.new())

, это возвращает

<<strong> main .class1 объект в 0x0000027B681E57F0>
<<strong> main .class1 объект в 0x0000027B681E57F0>

желаемый результат

<<strong> main .class1 объект в 0x0000027B681E57F0>
<<strong> main .class2 объект в 0x0000027B681E57F0>

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы можете использовать __class__ для этого:

class class1(object):
    def new(self):
        return self.__class__()

class class2(class1):
    pass

c1 = class1()
c2 = class2()
print(c1.new())
print(c2.new())
0 голосов
/ 11 мая 2018

вы можете получить текущий класс следующим образом:

class class1:
    def __init__(self):
        self.foo = 1
        self.bar = 2
    def new(self):
        return self.__class__()

Наследующие вернут свои собственные классы.Однако вам придется самостоятельно обрабатывать логику для любых других __init__ подписей.Классный метод был бы лучшим выбором для проектирования, если вам не нужна информация из текущего экземпляра для создания нового.

0 голосов
/ 11 мая 2018

Вместо этого определите метод класса:

class Class1:
    def __init__(self):
        self.foo = 1
        self.foo = 2

    @classmethod
    def new(cls):
        return cls()

class Class2(Class1):
    pass

Теперь, когда вы вызываете c2.new(), среда выполнения увидит, что Class2 не имеет метода с именем new, но Class1 делает. Кроме того, Class2 будет передано как неявный аргумент new, а не Class1.

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

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