Я пытаюсь найти чистый способ использования наследования для пользовательских классов. У меня есть следующая структура каталогов.pythonic способ настройки классов
inheritTest.py
Level1
__init__.py
t_Generic.py
Level2
__init__.py
t_Custom.py
Цель: Я хочу, чтобы все классы t_Generic доступны путем импортирования модуля t_Custom и позволяют необходимую настройку в t_Custom.
Нет ничего в двух из init .py файлов выше.
t_Generic.py содержит некоторые общие классы, подобные этим:
class A(object):
def __init__(self):
self.hello = "Hello! I am Mr.A from t_generic"
def someOtherMethod(self):
pass
class B(object):
def __init__(self):
self.hello = "Hello! I am Mr.B from t_generic"
def someOtherMethod(self):
pass
class C(object):
def __init__(self):
self.hello = "Hello! I am Mr.C from t_generic"
def changeHello(self):
pass
Экспериментальная t_Custom.py как показано ниже:
import Level1.t_Generic
#Override any Generic classes in this module.
#Option 1: Let's get Generic A so it lives in this scope as A
from Level1.t_Generic import A
#Option 2: Let's create B and inherit from Generic, make future custom changes here
class B(Level1.t_Generic.B):
def __init__(self):
super(B,self).__init__()
#I really want to inherit from C and change it's behavior
class C(Level1.t_Generic.C):
def __init__(self):
super(C,self).__init__()
def changeHello(self):
self.hello = "Hello! I am Mr.C modified in t_Custom"
Вопрос: Что вещий способ сделать что-то вроде этого? Должен ли я просто импортировать все общие классы в пользовательский модуль, как в варианте 1, или мне нужно создать унаследованный класс в Custom, как в Варианте 2, и изменить те, на которые я хочу наследовать?
Пример использования, в inheritTest.py:
import Level2.t_Custom
a = Level2.t_Custom.A()
b = Level2.t_Custom.B()
c = Level2.t_Custom.C()
print a.hello
print b.hello
print c.hello
c.changeHello()
print c.hello
выход:
Hello! I am Mr.A from t_generic
Hello! I am Mr.B from t_generic
Hello! I am Mr.C from t_generic
Hello! I am Mr.C modified in t_Custom
Как именно вы собираетесь использовать эту настройку? С примером игрушек, который вы предоставили, трудно сказать, есть ли лучший способ. Должны ли пользовательские классы иметь то же имя, что и общие? Будет ли множество «настраиваемых» модулей переопределения? Как вы решаете, когда использовать общие и пользовательские? Можно ли рассматривать смесь как альтернативу? – tzaman
@tzaman, (1) Да, общие и пользовательские должны иметь одинаковые имена. (2) Будет создано несколько настраиваемых модулей переопределения, но все они будут наследоваться от родовых и не наступать друг на друга. (3) Пользовательский обычно используется на основе некоторых аргументов, если нет соответствующего настраиваемого модуля для аргументов, он будет напрямую импортировать общие модули и использовать их. Таким образом, в этом случае я буду обернуть импорт в состоянии или попытаться/поймать. – user3885927