如何正确处理python继承

乔什·霍洛维兹(Josh Horowitz)

我已经阅读了python文档,但是我仍然对继承有疑问。

  • 似乎在旧版本的python中,您可以将参数传递给super,但不再可以传递。如果SuperClass使用其参数进行某种设置怎么办?
  • 如果从对象继承,我应该叫超级吗?据我所知,这并没有什么功能上的区别。
  • 这在python 2.7与3.x中的处理方式不同吗?

这是应该如何处理继承的吗?

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中正确处理Logger文件大小?

来自分类Dev

如何正确处理Visual Studio关闭?

来自分类Dev

AngularJS-如何正确处理承诺

来自分类Dev

如何正确处理AsyncTasks的RejectedExecutionException?

来自分类Dev

如何正确处理标头中的异常?

来自分类Dev

如何正确处理异步并发请求?

来自分类Dev

如何正确处理SSLSocketImpl死锁?

来自分类Dev

如何正确处理回调堆栈

来自分类Dev

如何正确处理python中的可选功能

来自分类Dev

如何正确处理ThreadLocal变量?

来自分类Dev

OCaml:如何正确处理总和类型?

来自分类Dev

如何正确处理请求承诺错误?

来自分类Dev

Flask下的fork如何正确处理?

来自分类Dev

如何正确处理python错误

来自分类Dev

如何正确处理异步操作?

来自分类Dev

如何正确处理左边距?

来自分类Dev

我如何正确处理此承诺?

来自分类Dev

如何正确处理Python中的浮点运算?

来自分类Dev

如何正确处理httpClient?

来自分类Dev

Firebase函数如何正确处理错误

来自分类Dev

如何在Python中正确处理Logger文件大小?

来自分类Dev

如何正确处理scanf()

来自分类Dev

CSS堆叠顺序-如何正确处理?

来自分类Dev

如何正确处理此SFINAE?

来自分类Dev

AngularJS-如何正确处理承诺

来自分类Dev

如何正确处理SSLSocketImpl死锁?

来自分类Dev

如何正确处理Python时钟中的累加器?

来自分类Dev

如何正确处理并发?

来自分类Dev

如何正确处理导航