我一直在阅读一些代码并遇到一些让我觉得我理解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
,为什么会有super
? object
类是否有get_config
方法? (不是我能看到的)。这是一种防御性编程技术,如果一个类介于object
和Model
之间?如果是这样,经常和为什么会发生这种事情?如果没有,是否还有其他原因super
?
答案 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)