如何访问继承类的关键字参数默认值

时间:2018-05-06 19:54:46

标签: python arguments subclass seaborn default-value

我试图对seaborn.JointGrid类进行一些修改。我的计划是创建一个子类并继承JointGrid类中的大多数方法,如下所示:

import seaborn

class CustomJointGrid(seaborn.JointGrid):

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

如果我这样做,我无法访问变量sizeratiospace等,它们是__init__ method of 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__进行初始化。也许这就是为什么我不能从我的孩子班中访问它们?

如何访问这些变量sizeratiospace等?

2 个答案:

答案 0 :(得分:3)

您可以使用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}

请注意,您的代码只需执行一次,因为导入的类的签名不会更改。

答案 1 :(得分:1)

为什么不使用与要子类相同的参数?

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