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
我确信有很多冗余代码(我知道在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
正如其他人指出的那样,你可以更换线路
Person.__init__(self, name, phone)
同
super(Teenager, self).__init__(name, phone)
并且代码将执行相同的操作.这是因为在python instance.method(args)中只是简写Class.method(instance, args).如果你想使用,super你需要确保你在我的代码中指定object为基类Person.
在Python文档有关于如何使用的详细信息super关键字.在这种情况下,重要的是它告诉python __init__在超类中查找self不是的方法Teenager
Tom*_*Tom 15
稍微清洁我喜欢这样做:
class Teenager(Person):
        def __init__(self, *args, **kwargs):
           self.website=kwargs.pop('website')
           super(Teenager, self).__init__(*args, **kwargs)
在这种情况下它没有太大的区别,但是如果你有__init__大量的论据,它会让生活更轻松.
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
更多相关内容:http://docs.python.org/tutorial/classes.html#inheritance
到目前为止,所有示例都适用于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