使用__init__继承属性

use*_*042 39 python polymorphism inheritance attributes

我是刚刚开始学习Python的Java人.举个例子:

class Person():
    def __init__(self, name, phone):
        self.name = name
        self.phone = phone

class Teenager(Person):
    def __init__(self, name, phone, website):
        self.name=name
        self.phone=phone
        self.website=website
Run Code Online (Sandbox Code Playgroud)

我确信有很多冗余代码(我知道在Java中,上面的代码有很多冗余).

关于哪些属性已从父类继承,哪些部分是多余的?

mur*_*d99 48

__init__在python中为类编写函数时,应始终调用__init__其超类的函数.我们可以使用它将相关属性直接传递给超类,因此您的代码如下所示:

class Person(object):
    def __init__(self, name, phone):
        self.name = name
        self.phone = phone
class Teenager(Person):
    def __init__(self, name, phone, website):
        Person.__init__(self, name, phone)
        self.website=website
Run Code Online (Sandbox Code Playgroud)

正如其他人指出的那样,你可以更换线路

Person.__init__(self, name, phone)
Run Code Online (Sandbox Code Playgroud)

super(Teenager, self).__init__(name, phone)
Run Code Online (Sandbox Code Playgroud)

并且代码将执行相同的操作.这是因为在python instance.method(args)中只是简写Class.method(instance, args).如果你想使用,super你需要确保你在我的代码中指定object为基类Person.

Python文档有关于如何使用的详细信息super关键字.在这种情况下,重要的是它告诉python __init__在超类中查找self不是的方法Teenager

  • 请注意,如果您使用的是Python 2.x,则必须将`object`显式列为`Person`的基类才能使用`super()`.否则,你必须使用`Person .__ init__`表格. (5认同)

Tom*_*Tom 15

稍微清洁我喜欢这样做:

class Teenager(Person):
        def __init__(self, *args, **kwargs):
           self.website=kwargs.pop('website')
           super(Teenager, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

在这种情况下它没有太大的区别,但是如果你有__init__大量的论据,它会让生活更轻松.

  • 使用 args 和 kwargs 通常会导致不一致的行为。明确地从 ``kwargs`` 中获取关键字意味着``Teenager('a', 'b', 'c')`` 将*不能*正常工作。它因 KeyError 而失败,因为在这种情况下 ``website`` 是 ``args[2]``。 (3认同)

Mis*_*iev 6

Python中的属性在构造函数中定义并且未调用父类构造函数时不会继承,除非您手动执行所有操作:

class Person():
    def __init__(self, name, phone):
        self.name = name
        self.phone = phone
class Teenager(Person):
    def_init_(self, name, phone, website):
        Person.__init__(self, name, phone)  # Call parent class constructor.
        self.website=website
Run Code Online (Sandbox Code Playgroud)

更多相关内容:http://docs.python.org/tutorial/classes.html#inheritance


Mic*_*ros 5

到目前为止,所有示例都适用于Python 2.x,但这是适用于Python 3.x的解决方案,该解决方案利用了super()的较短版本,并且没有从object继承。

class Person:
    def __init__(self, name, phone):
        self.name = name
        self.phone = phone

class Teenager(Person):
    def __init__(self, name, phone, website):
        super().__init__(name, phone)
        self.website = website
Run Code Online (Sandbox Code Playgroud)