python - 在基类中使用派生类的属性
问题描述
在我正在处理的项目中,我们有一个类层次结构,每个类都定义一个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中有类似的可能吗?
解决方案
回答我自己的问题(感谢评论者!)以下两种方式都有效:
return self.__class__.TEXT
在这里,self.__class__
指向Derived1
或指向可以Derived2
访问TEXT
.
return self.TEXT
使这一步骤更短,因为属性解析算法会自动访问类属性。
推荐阅读
- sql - 如何根据 sqlite 中的另一列为每个组选择前 3 名?
- node.js - Dialog api v2 - 获取应用程序默认凭据时出现意外错误:无法加载默认凭据
- oracle - Oracle MERGE 语句是否在提交完成之前返回
- r - R:使用观察次数删除变量
- tfs - 下载 TFS 流程模板
- react-native - React-native Flatlist 问题不使用 fetch api 呈现单个项目
- javascript - 如何以动态方式从一个元素到另一个元素绘制一条线?
- sql - 日期时间 SQL 语句(在 SQL Developer 中工作)
- c++ - 来自非零坐标的向量中的 8 邻域
- python - 如果我从实例调用 driver.close() ,它不会关闭 selenium 上的选项卡