【发布时间】:2021-12-06 17:13:02
【问题描述】:
我有一个可供其他人使用的 Python 库:
class BaseClassA:
class BaseClassB:
def func0(self):
this.class_a_obj = BaseClassA()
BaseClassB 创建一个 BaseClassA 对象并存储一个指针。这是一个问题,因为我想允许用户扩展我的库类:
class ExtendClassA(BaseClassA):
而且我的库应该在func0方法中选择扩展类(ExtendClassA)而不是基类(BaseClassA)。
上面是我的问题陈述的一个非常简单的例子。实际上,我有 10 个类进行扩展/创建。我想避免用户不得不在扩展的BaseClassB 中重写func0 以支持他们创建的新ExtendClassA 类。
我正在与堆栈溢出社区联系,以了解其他人针对此类问题实施了哪些解决方案。我最初的想法是拥有一个“注册”类类型/构造函数的全局字典,并且类将从全局字典中获取类构造函数。当用户想要扩展一个类时,他们会将字典中的类替换为新类。
库代码:
global lib_class_dict
lib_class_dict['ClassA'] = BaseClassA()
lib_class_dict['ClassB'] = BaseClassB()
class BaseClassA:
class BaseClassB:
def func0(self):
this.class_a_obj = lib_class_dict['ClassB']
用户代码:
lib_class_dict['ClassA'] = ExtendClassA():
class ExtendClassA:
编辑:添加有关我正在处理的复杂性的更多详细信息。
我有一些场景,方法调用被深埋在库中,这使得很难从用户入口点传递一个类 -> 函数:
(用户会在下面的例子中调用BaseClassB.func0())
class BaseClassA:
class BaseClassB:
def func0(self):
this.class_c_obj = BaseClassC()
class BaseClassC:
def __init__(self):
this.class_d_obj = BaseClassD()
class BaseClassD:
def __init__(self):
this.class_a_obj = BaseClassA()
多个类可以创建一种类型的对象:
class BaseClassA:
class BaseClassB:
def func0(self):
this.class_a_obj = BaseClassA()
class BaseClassC:
def __init__(self):
this.class_a_obj = BaseClassA()
class BaseClassD:
def __init__(self):
this.class_a_obj = BaseClassA()
出于这些原因,我希望拥有一个全球或中心位置,所有课程都可以获取正确的课程。
【问题讨论】:
-
考虑包含实际类的精简版本。一些架构决策可以通过您期望您的类如何交互来决定(这反过来又由它们的功能决定)。名称中缺少该名称,例如
ClassA,ClassB -
一个来自非专业人士的非常愚蠢的想法:是否可以使用 init_subclass 方法,并以某种方式重新定义一个函数?远射,但也许可以玩...stackoverflow.com/questions/45400284/…
-
在您的第一个示例中,每个
BaseClassB都有自己的BaseClassA对象,而在库代码中,它们都共享lib_class_dict中引用的相同实例。正确的预期行为是什么?
标签: python oop inheritance