面向对象三大特性之继承
Posted youhongliang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象三大特性之继承相关的知识,希望对你有一定的参考价值。
一、什么是面向对象的继承
官方的说法:是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。 一般静态的面向对象编程语言,继承属于静态的,意即在子类别的行为在编译期就已经决定,无法在执行期扩充。
字面意思就是:子承父业,合法继承家产,就是如果你是独生子,而且你也很孝顺,不出意外,你会继承你父母所有家产,他们的所有财产都会由你使用(败家子儿除外)。
举个栗子:
class Person: def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex class Cat: def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex class Dog: def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex # 继承的用法: class Aniaml(object): def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex class Person(Aniaml): pass class Cat(Aniaml): pass class Dog(Aniaml): pass
继承的优点也是显而易见的:
1,增加了类的耦合性(耦合性不宜多,宜精)。
2,减少了重复代码。
3,使得代码更加规范化,合理化。
二、继承的分类
上面的例子:
Aminal 叫做父类,基类,超类。
Person Cat Dog: 子类,派生类。
继承:可以分单继承,多继承。
这里需要补充一下python中类的种类(继承需要):
在python2x版本中存在两种类.:
?个叫经典类. 在python2.2之前. ?直使?的是经典类. 经典类在基类的根如果没有什么都不写. # 深度优先
?个叫新式类. 在python2.2之后出现了新式类. 新式类的特点是基类的根是object类。 # 广度优先
python3x版本中只有一种类:
python3中使?的都是新式类. 如果基类谁都不继承. 那这个类会默认继承 object
三、单继承
1、类名、对象执行父类的方法
class Aniaml(object): type_name = ‘动物类‘ def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print(self) print(‘吃东西‘) class Person(Aniaml): pass class Cat(Aniaml): pass class Dog(Aniaml): pass # 类名: print(Person.type_name) # 可以调用父类的属性,方法。 Person.eat(111) print(Person.type_name) # 对象: # 实例化对象 p1 = Person(‘春哥‘,‘男‘,18) print(p1.__dict__) # 对象执行类的父类的属性,方法。 print(p1.type_name) p1.type_name = ‘666‘ print(p1) p1.eat()
2、执行顺序
class Aniaml(object): type_name = ‘动物类‘ def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print(self) print(‘吃东西‘) class Person(Aniaml): def eat(self): print(‘%s 吃饭‘%self.name) class Cat(Aniaml): pass class Dog(Aniaml): pass p1 = Person(‘barry‘,‘男‘,18) # 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找。 p1.eat() # 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。
3、同时想执行类中以及父类中的方法
方法一:
如果想执行父类的func方法,这个方法并且子类中也用,那么就在子类的方法中写上:
父类.func(对象,其他参数)
举例说明:
class Aniaml(object): type_name = ‘动物类‘ def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print(‘吃东西‘) class Person(Aniaml): def __init__(self,name,sex,age,mind): ‘‘‘ self = p1 name = ‘春哥‘ sex = ‘laddboy‘ age = 18 mind = ‘有思想‘ ‘‘‘ # Aniaml.__init__(self,name,sex,age) # 方法一 self.mind = mind def eat(self): super().eat() print(‘%s 吃饭‘%self.name) class Cat(Aniaml): pass class Dog(Aniaml): pass # 方法一: Aniaml.__init__(self,name,sex,age) # p1 = Person(‘春哥‘,‘laddboy‘,18,‘有思想‘) # print(p1.__dict__) # 对于方法一如果不理解: # def func(self): # print(self) # self = 3 # func(self)
方法二:
利用super,super().func(参数)
class Aniaml(object): type_name = ‘动物类‘ def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print(‘吃东西‘) class Person(Aniaml): def __init__(self,name,sex,age,mind): ‘‘‘ self = p1 name = ‘春哥‘ sex = ‘laddboy‘ age = 18 mind = ‘有思想‘ ‘‘‘ # super(Person,self).__init__(name,sex,age) # 方法二 super().__init__(name,sex,age) # 方法二 self.mind = mind def eat(self): super().eat() print(‘%s 吃饭‘%self.name) class Cat(Aniaml): pass class Dog(Aniaml): pass # p1 = Person(‘春哥‘,‘laddboy‘,18,‘有思想‘) # print(p1.__dict__)
四、多继承、
class ShenXian: # 神仙 def fei(self): print("神仙都会?") class Monkey: # 猴 def chitao(self): print("猴?喜欢吃桃?") class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是?只猴 pass sxz = SunWukong() # 孙悟空 sxz.chitao() # 会吃桃? sxz.fei() # 会?
此时, 孙悟空是?只猴?, 同时也是?个神仙. 那孙悟空继承了这两个类. 孙悟空?然就可以执?这两个类中的?法. 多继承?起来简单. 也很好理解.
以上是关于面向对象三大特性之继承的主要内容,如果未能解决你的问题,请参考以下文章