The inheritance of attributes using __init__
我是刚开始学习Python的Java人。举个例子:
1 2 3 4 5 6 7 8 9 10 | 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中,上面的代码有很多冗余)。
关于哪些属性已经从父类继承,哪些部分是多余的?
在python中为类编写
1 2 3 4 5 6 7 8 | 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 |
正如其他人指出的那样,你可以替换这条线
1 | Person.__init__(self, name, phone) |
号
具有
1 | super(Teenager, self).__init__(name, phone) |
代码也会做同样的事情。这是因为在python中,
python文档提供了有关如何使用
稍微干净一点,我喜欢这样做:
1 2 3 4 | class Teenager(Person): def __init__(self, *args, **kwargs): self.website=kwargs.pop('website') super(Teenager, self).__init__(*args, **kwargs) |
。
在这种情况下,这并没有多大的区别,但是当你有一个
如果在构造函数中定义了python中的属性,并且不调用父类构造函数,则不会继承这些属性,除非手动执行所有操作:
1 2 3 4 5 6 7 8 | 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继承
到目前为止,所有的例子都是针对python 2.x的,但是这里有一个针对python 3.x的解决方案,它使用了较短的super()版本,并且不从对象继承。
1 2 3 4 5 6 7 8 9 | 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 |
。
与Java构造函数不同,EDCOX1×0是不为继承层次结构中的每个类自动调用的,您需要自己完成。
此外,所有对象层次结构都应该在
您的代码应为:
1 2 3 4 5 6 7 8 | class Person(object): def __init__(self, name, phone): self.name = name self.phone = phone class Teenager(Person): def_init_(self, name, phone, website): super(Teenager, self).__init__(name, phone) self.website=website |
您也可以编写