簡體   English   中英

返回當前類的新實例

[英]return new instance of current class

我想返回當前類的新實例,當繼承的類返回時,它將返回基類而不是當前類

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

這回來

< .class1對象位於0x0000027B681E57F0>
< .class1對象位於0x0000027B681E57F0>

理想的結果

< .class1對象位於0x0000027B681E57F0>
< .class2對象位於0x0000027B681E57F0>

定義一個類方法:

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

類方法比實例方法更合適,因為除了對象是什么類之外,您對對象調用該方法沒有其他興趣。

您可以為此使用__class__

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

class class2(class1):
    pass

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

您可以像這樣獲得當前的類:

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

繼承者將返回自己的類。 但是,您必須自己處理任何不同的__init__簽名的邏輯。 除非您需要當前實例中的信息來創建新實例,否則一種類方法將是更好的設計選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM