为了在 python 中调用隐藏的 class 方法,什么是转换的干净替代方法?

What is a clean alternative to casting in order to call a hidden class method in python?

我有两个项目具有一些共享结构,但项目特定要求不同。为了解决这个问题,我创建了两个基础 类:

class AbstractBaseClassA:
    def __init__(self) -> None:
        # do something
        pass


class AbstractBaseClassB:
    def __init__(self, a: AbstractBaseClassA) -> None:
        self.a = a
        # do something

我在那里有几个抽象方法,做一些项目之间共享的工作,但现在想进入项目细节。因此,我又创建了两个 类:

class ProjectSpecificClassA(AbstractBaseClassA):
    def __init__(self) -> None:
        super().__init__()
        # do something

    def someOtherMethod(self) -> None:
        # do something
        pass


class ProjectSpecificClassB(AbstractBaseClassB):
    def __init__(self, a: ProjectSpecificClassA) -> None:
        super().__init__(a)
        # do something
        self.a.someOtherMethod()  # <-- unresolved attribute reference

现在,在ProjectSpecificClassB的最后一行,我想调用ProjectSpecificClassA的项目特定函数,但是由于AbstractBaseClassB的继承,这个方法是未知。在像 Java 这样的语言中,这是我将 self.a 转换为 ProjectSpecificClassA 的地方,但由于 python 不支持转换,我正在寻找替代方案。我知道,从技术上讲,上述解决方案有效,但我想知道是否存在 linters / 预编译器也承认的 cleaner 解决方案?

Python 是动态的。这意味着 someOtherMethod 将在 运行 时被搜索,并且会被找到,因为 a 实际上是一个 ProjectSpecificClassA 对象。

在 Java 中需要强制转换,就像在 C++ 中一样,因为在编译时搜索方法,因此编译器必须知道在哪里找到它。

Python比那还要宽容。如果你不使用像 __slots__ 这样的特殊处理来防止动态属性创建,你可以将方法添加到特定对象并使用它。您可以这样使用 类:

a = ProjectSpecificClassA()
b = ProjectSpecificClassB(a)
b.a.special = lambda x: 2 * x
ProjectSpecificClassB.special = lambda self: self.a.special(3)

assert (b.special() == 6)