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

64
6

Я пытаюсь внести некоторые изменения в класс seaborn.JointGrid. Мой план состоял в том, чтобы создать класс child и наследовать большинство методов из класса JointGrid, например:

import seaborn

class CustomJointGrid(seaborn.JointGrid):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

Если я это сделаю, у меня нет доступа к переменным size, ratio, space и т.д., JointGrid являются частью метода __init__ JointGrid:

def __init__(self, x, y, data=None, size=6, ratio=5, space=.2,
dropna=True, xlim=None, ylim=None)

Я заметил, что эти переменные не инициализируются в классе JointGrid с обычным self.size = size в методе __init__. Возможно, поэтому я не могу получить к ним доступ из моего дочернего класса?

Как я могу получить доступ к этим переменным size, ratio, space т.д.?

спросил(а) 2021-01-19T14:56:29+03:00 6 месяцев, 1 неделя назад
1
Решение
89

Вы можете использовать inspect.getfullargspec для этого:

>>> import seaborn, inspect
>>> spec = inspect.getfullargspec(seaborn.JointGrid.__init__)
>>> defaults = spec.kwonlydefaults or {}
>>> defaults.update(zip(spec.args[-len(spec.defaults):], spec.defaults))
>>> defaults
{'data': None, 'size': 6, 'ratio': 5, 'space': 0.2, 'dropna': True, 'xlim': None, 'ylim': None}

Обратите внимание, что ваш код должен будет сделать это только один раз, поскольку подпись импортируемого класса не изменится.

ответил(а) 2021-01-19T14:56:29+03:00 6 месяцев, 1 неделя назад
64

Почему бы вам просто не использовать те же аргументы, что и класс, который вы хотите использовать для подкласса?

import seaborn

class CustomJointGrid(seaborn.JointGrid):

def __init__(self, x, y, data=None, size=6, ratio=5, space=.2,
dropna=True, xlim=None, ylim=None, **kwargs):
super().__init__(x, y, data=data, size=size, ratio=ratio, space=space,
dropna=dropna, xlim=xlim, ylim=ylim)

Кроме того, вы можете установить некоторые настройки самостоятельно,

class CustomJointGrid(seaborn.JointGrid):

def __init__(self, *args, **kwargs):
size = kwargs.get("size", 6)
kwargs.update(size=size)
super().__init__(*args, **kwargs)
# use size here
self.someattribute = size*100

ответил(а) 2021-01-19T14:56:29+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема