Jon*_*han 5 python inheritance
我有一个基类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
Run Code Online (Sandbox Code Playgroud)
我们的想法是,当somemethod()在子类的实例上调用时bc,它将能够使用该实例的派生程度最高的子类的名称,而无需事先知道可能存在哪些子类.
我为此编了一个测试用例:
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()
Run Code Online (Sandbox Code Playgroud)
运行此代码时,它会产生base_class而不是sub_class.
tob*_*s_k 10
作为@ poorsod解决方案的替代方案,对我来说非常好,这里是另一个,也许更简单的没有类方法的变体,使用self.__class__.就像self始终指向当前实例一样,self.__class__始终指向该实例的实际类.
class bc(object):
def get_subclass_name(self):
return self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)
示例,在Python 2.6.6中测试:
>>> class sc1(bc): pass
>>> class sc2(sc1): pass
>>> class sc3(sc2): pass
>>> print sc2().get_subclass_name()
sc2
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,请更具体地说明您期望的输出以及您获得的输出.
您需要一个类方法。
class bc(Object):
@classmethod
def get_subclass_name(cls):
return cls.__name__
def somemethod(self):
x = self.get_subclass_name()
Run Code Online (Sandbox Code Playgroud)
普通方法在调用时将实例作为第一个参数传递。这就是为什么您self在Python中到处都能看到的原因。
但是,当您调用类方法时,实例的具体类将传递给函数。cls就像我在这里所做的那样,我们通常使用名称。
类方法的经典用例是替代构造函数。例如,标准库的dict类提供了一个fromkeys类方法,该方法从提供的键和单个值构造一个新字典。您可以手动构建这样的字典,但是Python开发人员使您的生活变得轻松!