一, 什么是面向对象的继承
官方的说法: 是面向对象软件技术当中的一个概念. 如果一个类别 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() # 会?
此时, 孙悟空是? 只猴?, 同时也是? 个神仙. 那孙悟空继承了这两个类. 孙悟空? 然就可以执? 这两个类中的? 法. 多继承? 起来简单. 也很好理解.
来源: http://www.bubuko.com/infodetail-3394431.html