Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在基类中使用派生类的属性_Python_Inheritance - Fatal编程技术网

Python 在基类中使用派生类的属性

Python 在基类中使用派生类的属性,python,inheritance,Python,Inheritance,在我正在进行的项目中,我们有一个类的层次结构,每个类定义一个get\u 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):

在我正在进行的项目中,我们有一个类的层次结构,每个类定义一个
get\u 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.\uuuuu class\uuuuu
指向
Derived1
Derived2
类对象,这些对象可以访问
文本

return self.TEXT

由于属性解析算法自动访问类属性,因此缩短了这一步。

..
self.TEXT
?正如@jornsharpe所说,
self.TEXT
@jornsharpe-是的,很简单!抓住了C++模型,看不到明显的答案。