[英]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.