我已经阅读了python文档,但是我仍然对继承有疑问。
这是应该如何处理继承的吗?
class SuperClass(object):
def __init__(self, super_argument):
super(object, self).__init__()
self.super_argument = super_argument
self.foo()
class ChildClass(SuperClass):
def __init__(self, super_argument):
self.super_argument = super_argument
super(SuperClass, self).__init__()
如果是这样,那么这对于可能被继承的类而言,是否使该设计不可行?
class SuperClass(object):
def __init__(self, super_argument):
super(object, self).__init__()
self.foo(super_argument) # Argument passed instead without saving in self
似乎在旧版本的python中,您可以将参数传递给super,但不再可以传递。如果SuperClass使用其参数进行某种设置怎么办?
我认为您误解了在3.x中可以忽略哪些参数。在Python 2.x中,您需要传递参数super
以获取正确绑定的方法:
class MyClass(...):
def __init__(self, ...):
super(MyClass, self).__init__(...)
# ^ these arguments ^ not these
在3.x中,不需要提供这些参数,您可以调用super().method(...)
,但可以接受它们。
这与继承的行为相同object
-您必须这样做才能在2.x中获得新样式的类,但是无论您是否显式继承,3.x都会创建一个新样式的类object
。
无论哪种方式,您都可以将参数传递给上的方法super
。因此,如果您只为3.x编写,则可以执行以下操作:
class MyClass(SuperClass):
def __init__(self, super_arg, my_arg):
super().__init__(super_arg)
# ^ don't need these
# ^ still need these
self.my_arg = my_arg
如果从对象继承,我应该叫超级吗?
是的,因为您可能涉及多个继承。相比:
>>> class SuperClass1(object):
def __init__(self):
print("SuperClass1.__init__")
>>> class SuperClass2(object):
def __init__(self):
print("SuperClass2.__init__")
>>> class MyClass(SuperClass1, SuperClass2):
def __init__(self):
print("MyClass.__init__")
super(MyClass, self).__init__()
>>> MyClass()
MyClass.__init__
SuperClass1.__init__
<__main__.MyClass object at 0x02D0CC50>
和:
>>> class SuperClass1(object):
def __init__(self):
print("SuperClass1.__init__")
super(SuperClass1, self).__init__()
>>> class SuperClass2(object):
def __init__(self):
print("SuperClass2.__init__")
super(SuperClass2, self).__init__()
>>> class MyClass(SuperClass1, SuperClass2):
def __init__(self):
print("MyClass.__init__")
super(MyClass, self).__init__()
>>> MyClass()
MyClass.__init__
SuperClass1.__init__
SuperClass2.__init__
<__main__.MyClass object at 0x02BCDC10>
在前者中,由于SuperClass1
不调用super
,所以SuperClass2.__init__
永远不会到达。
这在python 2.7与3.x中的处理方式不同吗?
希望现在已经很清楚了-您需要在2.x中更明确(或者如果您正在编写在两个版本中都可以使用的代码),但是否则功能是相同的,并且您应该在两个版本super
中的所有级别上进行调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句