当前位置: 代码迷 >> python >> 从父类调用子类@classmethod
  详细解决方案

从父类调用子类@classmethod

热度:116   发布时间:2023-07-16 10:54:28.0

我正在尝试执行以下操作:

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_functionB类或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