python - 从父类调用子类@classmethod
问题描述
我正在尝试执行以下操作:
class A:
@classmethod
def test_function(cls, message):
cls.__get_the_function()
class B(A):
@classmethod
def __get_the_function(cls):
return print("BBBB")
class C(A):
@classmethod
def __get_the_function(cls):
return print("CCCC")
但是当我打电话时:
B.test_function("Test")
我得到以下信息:
AttributeError: type object 'B' has no attribute '_A__get_the_function'
我希望类A
来自__get_the_function
子类(类B
或C
取决于我使用的类),但看起来它正在尝试自己寻找它。
注意:我使用的是Python 3.8.2
解决方案
__
- 前缀名称在类创建期间特别处理。当函数由一个损坏的名称定义时,名称将被替换,就好像您已将函数定义为
@classmethod
def test_function(cls, message):
cls._A__get_the_function()
首先。
这样做是为了显式提供一种从子类中隐藏名称的方法。由于您要覆盖名称,__get_the_function
因此不是合适的名称;_
如果要将其标记为私有,请使用普通的前缀名称:
class A:
@classmethod
def test_function(cls, message):
cls._get_the_function()
# Define *something*, since test_function assumes it
# will exist. It doesn't have to *do* anything, though,
# until you override it.
@classmethod
def _get_the_function(cls):
pass
推荐阅读
- php - 如何从视图的 URL 中获取值并在控制器中使用它?
- php - 更好地检查 PHP 中的肯定或否定条件(或者它是否重要)
- google-sheets - 你如何只显示基于单元格的重复行?
- html - 如何在 jinja 中仅显示 5 个列表结果,从烧瓶返回结果?
- node.js - 我的代码一直在打印'Hi [{“FirstName”:“Martin”}]'。我怎样才能解决这个问题?
- c# - 按模式 mongodb 驱动器 c# 过滤
- python - 如何以编程方式将文件从 kubernetes pod 复制到 Google Cloud 存储桶
- firebase - Flutter - 在 null 上调用了方法 []
- javascript - 我不明白 reactJs 中的这个组件渲染行为
- javascript - 将一个键值分配给 JavaScript 中的另一个键值