나는 사용하는 일부 파이썬 코드를 생성 한 외부 클래스를 자사에서 내부 클래스 서로 좋은 아이디어를 기반으로, 답변 이 질문에 대한. 짧고 간단하며 이해하기 쉽다고 생각합니다.
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"클래스에 정의 된 함수가 참조하도록 설정되어 있으므로 부모 "b"의 "run_func"함수가 아니라a.run_func()
"a"클래스의 "run_func"함수를 호출하여 실행됩니다 . 클래스 "a"의 기능에 대한 것입니다.
이로 인해 문제가 발생할 수 있으며 (예 : 함수 a.run_func
가 삭제 된 경우) 클래스에서 코드를 다시 작성하지 않는 유일한 해결책 은 클래스 "a"에서 파생 된 모든 클래스에 대해 업데이트 된 코드로 a.x1
하위 클래스를 재정의 x1
하는 것입니다. 이는 분명히 어렵고 가치가 없습니다. 그것.