Я создал подкласс Game и подклассы HouseRules, Card и Player, который имеет новые методы и атрибуты в дополнение к методам и атрибутам соответствующих родителей. Я бы хотел, чтобы неизмененные методы продолжали работать так, как ожидалось, за исключением того, что они ссылаются на обновленные формы каждого класса. Ниже приведен мой минимальный воспроизводимый пример всего с одним классом (подклассом), который зависит от одного класса (подкласса).
Я создал класс Foo, который при инициализации принимает объект класса Obj. Если объект не указан, ему присваивается значение Obj() по умолчанию.
Код: Выделить всё
'src.py'
class Obj:
def __init__(self, a=1, b=1):
self.a = a
self.b = b
class Foo:
def __init__(self, obj=None):
self.obj=Obj() if obj is None else obj
...
Для новых функций Foo потребуется немного более сложный Obj с атрибутом z, поэтому я создал подкласс src.Obj .
Код: Выделить всё
'main.py'
import src
class Obj(src.Obj):
def __init__(self, z=0, **kwargs):
self.z = z
super().__init__(**kwargs)
class Foo(src.Foo):
def __init__(self, obj=None):
#self.obj=Obj() if obj is None else obj
super().__init__(obj)
Итак, я добавил строку и это исправляет.
Еще одна идея — заменить
Код: Выделить всё
'src.py'
class Foo:
def __init__(self, obj=None):
self.obj=Obj() if obj is None else obj
Код: Выделить всё
'src.py'
class Foo:
def __init__(self, obj=None):
self.obj=self.default_obj if obj is None else obj
@property
def default_obj(self): return Obj()
Третья идея — сделать Obj вложенным классом и установить для self.obj значение self.Obj().
Код: Выделить всё
'src.py'
class Foo:
class Obj:
def __init__(self, a=1, b=1):
...
def __init__(self, obj=None):
self.obj=self.Obj() if obj is None else obj
...
Код: Выделить всё
'main.py'
import src
class Foo(src.Foo):
class Obj(src.Foo.Obj):
def __init__(self, z=0, **kwargs):
...
def __init__(self, obj=None):
super().__init__(obj)
Но мой вопрос: во избежание повторения строки назначения obj (или, альтернативно, повторения метода получения или класса наследование или импорт src.py main), есть ли способ вызвать инициализацию родительского класса, которая превратит obj в Obj() в 'main.py' вместо 'src.py '?
Хотя в этом минимальном случае это будет всего лишь повторение одной простой строки (или метода получения), на самом деле у меня есть три обновленных подкласса. Использование этих методов, которые я рассмотрел, означало бы дословное копирование всех методов суперкласса, которые создают экземпляры этих подклассов, в подкласс, чтобы они ссылались на новые подклассы, что уменьшает преимущества использования наследования.
Если есть лучшая практика для достижения того, что я пытаюсь, а не создания подклассов каждого класса проекта, не стесняйтесь, дайте мне знать.
Подробнее здесь: https://stackoverflow.com/questions/788 ... a-subclass