簡體   English   中英

從超類獲取子類的名稱?

[英]Getting name of subclass from superclass?

我有一個基類bc和許多基於bc的子類。

class bc(Object):
  def get_subclass_name(self):
      # Retrieve the name of the most derived subclass of this instance
      pass
  def somemethod(self):
      x = self.get_subclass_name()

class sc1(bc):
    pass

class sc2(bc)
    pass

我們的想法是,當在bc的子類的實例上調用somemethod()時,它將能夠使用該實例的派生程度最大的子類的名稱,而無需事先知道可能存在哪些子類。

我為此編了一個測試用例:

class base_class(object):
    @classmethod
    def get_subclass_name(cls):
        return cls.__name__

    def somemethod(self):
        print(base_class.get_subclass_name())

class sub_class(base_class):
    pass

sub_class().somemethod()

運行此代碼時,它會生成base_class而不是sub_class

正如@ poorsod的解決方案的替代方案,對我來說非常好,這是另一個,也許更簡單的沒有類方法的變種,使用self.__class__ 就像self總是指向當前實例一樣, self.__class__總是指向該實例的實際類

class bc(object):
    def get_subclass_name(self):
        return self.__class__.__name__

示例,在Python 2.6.6中測試:

>>> class sc1(bc): pass
>>> class sc2(sc1): pass
>>> class sc3(sc2): pass
>>> print sc2().get_subclass_name()
sc2

如果這不起作用,請更具體地說明您期望的輸出以及您獲得的輸出。

你需要一個類方法

class bc(Object):
    @classmethod
    def get_subclass_name(cls):
        return cls.__name__

    def somemethod(self):
        x = self.get_subclass_name()

調用時,常規方法將實例作為第一個參數傳遞。 這就是為什么你在Python中到處看到self原因。

但是,在調用類方法時, 實例具體類將傳遞給該函數。 我們通常使用名稱cls ,就像我在這里所做的那樣。

類方法的經典用例是替代構造函數 例如,標准庫的dict類提供了一個fromkeys類方法,該方法根據提供的鍵和單個值構造一個新的dict。 您可以手動構建這樣的dict,但Python開發人員讓您的生活變得輕松!

暫無
暫無

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

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