9

我有一个基类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

这个想法是,当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()

运行此代码时,它会生成base_class而不是sub_class.

4

2 回答 2

13

作为@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

如果这不起作用,请更具体地说明您期望的输出以及您得到的输出。

于 2013-10-12T15:54:02.383 回答
8

你需要一个类方法

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

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

调用普通方法时,将实例作为第一个参数传递。这就是为什么你self在 Python 中随处可见的原因。

但是,当您调用类方法时,实例的具体类将传递给函数。我们通常使用 name cls,就像我在这里所做的那样。

类方法的经典用例是替代构造函数。例如,标准库的dict类提供了一个fromkeys类方法,它从提供的键和单个值构造一个新的字典。您可以手动构建这样的字典,但 Python 开发人员让您的生活变得轻松!

于 2013-10-12T15:28:17.503 回答