首页 > 解决方案 > 在基类中使用派生类的属性

问题描述

在我正在处理的项目中,我们有一个类层次结构,每个类都定义一个get_text()方法。

class Base:
    def get_text(self):
        raise NotImplementedError

class Derived1(Base):
    def get_text(self):
        return "Text from Derived1"

class Derived2(Base):
    def get_text(self):
        return "Text from Derived2"

obj1 = Derived1()
print(obj1.get_text())
==> 'Text from Derived1'

obj2 = Derived2()
print(obj2.get_text())
==> 'Text from Derived2'

这样,程序员可以调用并从指向obj.get_text()的类中获取文本。obj

现在我想将该方法重构为一个属性(称为TEXT)。不过,我想保留原始方法以实现向后兼容性。有没有办法只在基类中做到这一点?

class Base:
    def get_text(self):
        """
        Keep backward compatibility.
        """
        return TEXT  # What should be here?

class Derived1(Base):
    TEXT = "Text from Derived1"

class Derived2(Base):
    TEXT = "Text from Derived2"

obj1 = Derived1()
print(obj1.TEXT)

# Non-refactored code
obj2 = Derived2()
print(obj2.get_text())
==> NameError: name 'TEXT' is not defined

来自 C++,我习惯于使用 C++ 虚拟方法调度让指向基类的指针从派生类调用方法。Python中有类似的可能吗?

标签: pythoninheritance

解决方案


回答我自己的问题(感谢评论者!)以下两种方式都有效:

return self.__class__.TEXT

在这里,self.__class__指向Derived1或指向可以Derived2访问TEXT.

return self.TEXT

使这一步骤更短,因为属性解析算法会自动访问类属性。


推荐阅读