Можете ли вы вызвать метод родительского класса так, чтобы он ссылался на подкласс с тем же именем, что и класс, от котоPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Можете ли вы вызвать метод родительского класса так, чтобы он ссылался на подкласс с тем же именем, что и класс, от кото

Сообщение Anonymous »

У меня есть игра, которая ссылается на классы HouseRules, Card и Player. Я хотел бы добавить функциональность каждому классу.
Я создал подкласс 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 в новом проекте, поэтому я создал новый файл и создал подкласс src.Foo.< /p>
Для новых функций 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)
Изначально я не включил закомментированную строку. Я думал, что если obj будет передан как None, super().__init__(obj) превратит obj в новый улучшенный Obj().Но он стал старым Obj() и выдал ошибку, когда я попытался получить доступ к его несуществующему атрибуту z.
Итак, я добавил строку и это исправляет.

Еще одна идея — заменить

Код: Выделить всё

'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()
Затем скопируйте метод получения и вставьте его в Foo в «main.py», где он вернет Obj() из «main.py».

Третья идея — сделать 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)
Я слышал, что вложенных классов обычно следует избегать. Кроме того, я заметил, что не могу использовать super().Obj, мне пришлось набрать src.Foo.Obj, что означает, что если я изменю имя суперкласса или что-то в этом роде, у меня будет чтобы обязательно изменить его в двух местах.
Но мой вопрос: во избежание повторения строки назначения obj (или, альтернативно, повторения метода получения или класса наследование или импорт src.py main), есть ли способ вызвать инициализацию родительского класса, которая превратит obj в Obj() в 'main.py' вместо 'src.py '?
Хотя в этом минимальном случае это будет всего лишь повторение одной простой строки (или метода получения), на самом деле у меня есть три обновленных подкласса. Использование этих методов, которые я рассмотрел, означало бы дословное копирование всех методов суперкласса, которые создают экземпляры этих подклассов, в подкласс, чтобы они ссылались на новые подклассы, что уменьшает преимущества использования наследования.
Если есть лучшая практика для достижения того, что я пытаюсь, а не создания подклассов каждого класса проекта, не стесняйтесь, дайте мне знать.

Подробнее здесь: https://stackoverflow.com/questions/788 ... a-subclass
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»