我怎样才能解释这种Python超级语句的用法

时间:2016-04-15 17:02:04

标签: python python-2.7 inheritance super

我一直在阅读一些代码并遇到一些让我觉得我理解super的事情比我想象的要差。我看到的是:

class Model(object):
    '''Abstract base model class.
    '''

    ...

    def get_config(self, verbose=0):
         '''Return the configuration of the model
            as a dictionary.

            To load a model from its configuration, use
            `keras.models.model_from_config(config, custom_objects={})`.
         '''
         config = super(Model, self).get_config()

现在,Model类仅继承自object,为什么会有superobject类是否有get_config方法? (不是我能看到的)。这是一种防御性编程技术,如果一个类介于objectModel之间?如果是这样,经常和为什么会发生这种事情?如果没有,是否还有其他原因super

1 个答案:

答案 0 :(得分:1)

object没有有效的实例方法get_config()所以此代码具体应该不起作用。但是,super本质上采用派生类的父类。这是Python2语法。在Python3中,您只需在没有参数的情况下调用super()

无论如何,这是一个例子:

class Number(int):
    def __eq__(self, other):
        equal = super(Number, self).__eq__(other)
        print("{} and {} are {}equal".format(self, other, "not " if not equal else ""))
        return equal

    def __str__(self):
        return "Number({})".format(super(Number, self).__str__())

i = Number(5)
j = Number(7)
print(i == j) # Output:
"""
Number(5) and Number(7) are not equal
False
"""

这继承自int并将修改int的实例方法,同时仍然能够使用原始方法。

为了使这段代码有效,您可以重载object类(我不建议这样做......)。

class object(object):
    def __init__(self):
        pass

    def get_config(self):
        print("Getting object Config")
        return "config"


class Foo(object):
    def __init__(self):
        self.config = None

    def get_config(self):
        self.config = super(Foo, self).get_config()
        print("Getting Foo Config")

i = Foo()
i.get_config()
print(i.config)