返回当前类的新实例

时间:2018-05-11 17:26:17

标签: python class inheritance

我想返回当前类的新实例,当一个继承的类返回它将返回基类而不是当前类

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())

返回

< main .class1对象位于0x0000027B681E57F0>

< main .class1对象位于0x0000027B681E57F0>

期望的结果

< main .class1对象位于0x0000027B681E57F0>

< main .class2对象位于0x0000027B681E57F0>

3 个答案:

答案 0 :(得分:1)

改为定义一个类方法:

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

类方法比实例方法更合适,因为你不会对调用方法的对象产生任何其他兴趣。

答案 1 :(得分:0)

您可以使用__class__

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

class class2(class1):
    pass

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

答案 2 :(得分:0)

你可以得到这样的当前课程:

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

继承者将返回自己的类。但是,您必须自己处理任何不同__init__签名的逻辑。除非您需要当前实例中的信息来创建新的方法,否则类方法将是更好的设计选择。