基于这个问题的另一个答案,我创建了一些Python代码来使用其内部类中的外部类。我认为它简短,简单且易于理解。
class higher_level__unknown_irrelevant_name__class:
def __init__(self, ...args...):
...other code...
# Important lines to access sub-classes.
subclasses = self._subclass_container()
self.some_subclass = subclasses["some_subclass"]
del subclasses # Free up variable for other use.
def sub_function(self, ...args...):
...other code...
def _subclass_container(self):
_parent_class = self # Create access to parent class.
class some_subclass:
def __init__(self):
self._parent_class = _parent_class # Easy access from self.
# Optional line, clears variable space, but SHOULD NOT BE USED
# IF THERE ARE MULTIPLE SUBCLASSES as would stop their parent access.
# del _parent_class
class subclass_2:
def __init__(self):
self._parent_class = _parent_class
# Return reference(s) to the subclass(es).
return {"some_subclass": some_subclass, "subclass_2": subclass_2}
主代码为“生产就绪”(无注释等)。切记将尖括号(例如<x>
)中的每个值全部替换为所需值。
class <higher_level_class>:
def __init__(self):
subclasses = self._subclass_container()
self.<sub_class> = subclasses[<sub_class, type string>]
del subclasses
def _subclass_container(self):
_parent_class = self
class <sub_class>:
def __init__(self):
self._parent_class = _parent_class
return {<sub_class, type string>: <sub_class>}
有关此方法如何工作的说明(基本步骤):
创建一个命名_subclass_container
为充当包装器的函数,以访问变量self
(对高层类的引用)(从在函数内部运行的代码)。
创建一个名为_parent_class
的变量self
,该变量引用此函数的变量,子类_subclass_container
可以访问该变量(避免名称与self
子类中的其他变量发生冲突)。
将子类/子类作为字典/列表返回,以便调用该_subclass_container
函数的代码可以访问内部的子类。
在__init__
更高级别的类(或其他需要的地方)中的函数中,将返回的子类从函数接收_subclass_container
到变量中subclasses
。
将存储在subclasses
变量中的子类分配给更高级别的类的属性。
一些使场景更容易的提示:
使将子类分配给更高级别的类的代码更易于复制,并在从其 功能发生了变化的更高级别的类派生的类中使用__init__
:
在主代码的第12行之前插入:
def _subclass_init(self):
然后将(主代码的)第5-6行插入此功能,并用以下代码替换第4-7行:
self._subclass_init(self)
当存在大量/未知数量的子类时,可以将子类分配给更高级别的类。
用以下代码替换第6行:
for subclass_name in list(subclasses.keys()):
setattr(self, subclass_name, subclasses[subclass_name])
该解决方案将是有用的,并且应该无法获得更高级别的类名的示例场景:
创建一个名为“ a”(class a:
)的类。它具有需要访问它的子类(父类)。一个子类称为“ x1”。在此子类中,将a.run_func()
运行代码。
然后,从类“ a”()派生另一个名为“ b”的类class b(a):
。之后,将运行一些代码b.x1()
(调用b的子函数“ x1”(派生的子类))。该函数运行a.run_func()
,调用类“ a” 的函数“ run_func ”,而不是其父级“ b”的函数“ run_func”(应如此),因为在类“ a”中定义的函数被设置为引用类“ a”的功能,因为它是其父级。
这将导致问题(例如,如果函数a.run_func
已被删除),并且不重写类中代码的唯一解决方案a.x1
将是x1
使用从类“ a”派生的所有类的更新代码重新定义子类,这显然是困难且不值得的它。