Python использование атрибута класса дочернего класса в качестве параметра по умолчанию без переопределения метода - PullRequest
0 голосов
/ 10 апреля 2020

При инициализации класса аргумент по умолчанию для параметра является атрибутом класса константы.

class SomeClass:
    """Some class."""

    DEFAULT_VAL = 0

    def __init__(self, some_param: int = DEFAULT_VAL):
        print(f"default = {self.DEFAULT_VAL} and some_param = {some_param}.")


some_class = SomeClass()

Печать: default = 0 and some_param = 0.

Когда я создаю подкласс класса и переопределяю константу Атрибут класса, он не использует его в качестве параметра по умолчанию.

class SomeChildClass(SomeClass):
    """Some child class."""

    DEFAULT_VAL = 1


some_child_class = SomeChildClass()

Печать: default = 1 and some_param = 0.

Есть ли какой-нибудь способ, которым я могу сделать эту работу, без явного переопределения __init__ в дочернем классе?


Исследования

Как вызвать родительский класс init со значениями по умолчанию из дочернего класса?

Вопрос очень похож, но они переопределяют __init__.

Повторная инициализация атрибутов родительского класса во время определения дочернего класса

Представляет возможное решение используя metaclass для указания DEFAULT_VAL через __new__. Это решение добавляет многословие к SomeClass, что не так уж и плохо. Мне интересно, если это можно сделать еще проще, хотя.

Переопределение переменных класса в python

В этот ответ , он информирует меня проблема в том, что DEFAULT_VAL вычисляется, когда определена функция __init__. Однако я не совсем уверен, применимо ли classmethod в моем случае использования.

1 Ответ

2 голосов
/ 10 апреля 2020

Проблема здесь в том, что значения по умолчанию принимают объекты, а не переменные / атрибуты . Объект оценивается один раз , когда функция определена. Общий c способ решить в любой функции - сделать что-то вроде:

class SomeClass:
    """Some class."""

    DEFAULT_VAL = 0

    def __init__(self, some_param: int = None):
        if some_param is None:
            some_param = self.DEFAULT_VAL
        print(f"default = {self.DEFAULT_VAL} and some_param = {some_param}.")
...