面向对象的三大特点:
1、封装 2、继承 3、多态
继承:可以有效的节省代码
示例:
首先定义下面三个子类,把他们的共同特点在定义到一个父类里面,然后每个子类调用父类。
1 class Animal: 2 def __init__(self, varieties, sex, color): 3 self.varieties = varieties 4 self.sex = sex 5 self.color = color 6 7 class Cat(Animal): 8 pass 9 10 class Dog(Animal): 11 pass 12 13 class Pig(Animal): 14 pass 15 16 cat = Cat('加菲猫', 'male', 'orange') 17 dog = Dog('法国斗牛犬', 'female', 'white') 18 pig = Pig('野猪', 'male', 'black') 19 20 print(cat.__dict__) 21 # {'varieties': '加菲猫', 'sex': 'male', 'color': 'orange'} 22 23 print(dog.__dict__) 24 # {'varieties': '法国斗牛犬', 'sex': 'female', 'color': 'white'} 25 26 print(pig.__dict__) 27 # {'varieties': '野猪', 'sex': 'male', 'color': 'black'}
Animal就是父类
Cat 和Dog以及Pig都属于子类
练习题:把下面相同部分定义一个父类
1 """ 2 class 猫: 3 def爬树(self): 4 print '爬树' 5 6 def 吃(self): 7 # do something 8 9 def 喝(self): 10 # do something 11 12 def 拉(self): 13 # do something 14 15 def 撒(self): 16 # do something 17 18 class 狗: 19 def 看门(self): 20 print '看门' 21 22 def 吃(self): 23 # do something 24 25 def 喝(self): 26 # do something 27 28 def 拉(self): 29 # do something 30 31 def 撒(self): 32 # do something 33 """
1 class livest: 2 def 吃(self): 3 print('吃饭') 4 5 def 喝(self): 6 print('喝水') 7 8 def 拉(self): 9 print('拉粑粑') 10 11 def 撒(self): 12 print('撒尿') 13 14 class 猫(livest): 15 def 爬树(self, name): 16 self.name = name 17 print('%s爬树' % self.name) 18 19 class 狗(livest): 20 def 看门(self,name): 21 self.name = name 22 print('%s看门' % self.name ) 23 24 cat = 猫() 25 dog = 狗() 26 27 cat.爬树('阿花') 28 # 阿花爬树 29 30 print(cat.__dict__) 31 # {'name': '阿花'} 32 33 cat.吃() 34 # 吃饭 35 36 cat.喝() 37 # 喝水 38 39 cat.拉() 40 # 拉粑粑 41 42 cat.撒() 43 # 撒尿 44 45 dog.看门('李富贵') 46 # 李富贵看门 47 48 print(dog.__dict__) 49 # {'name': '李富贵'} 50 51 dog.吃() 52 # 吃饭 53 54 dog.喝() 55 # 喝水 56 57 dog.拉() 58 # 拉粑粑 59 60 dog.撒() 61 # 撒尿
下一篇:
class A:
pass
a = A()
执行结果不报错,为什么呢???
因为,在python3.x中,默认的所有类都默认继承一个object的类,又被称为新式类。
在python中,有两种类,新式类和经典类
python2.X中,有经典类和新式类
python3.X中,只有新式类
新式类:遵循广度优先
经典类:遵循深度优先
继承:分为单继承和多继承
继承的执行顺序:如果子类和父类中同时存在了相同的方法,则执行子类里的方法,不会执行父类的方法。
示例:
1 class Animal: 2 def __init__(self, varieties, sex, color): 3 self.varieties = varieties 4 self.sex = sex 5 self.color = color 6 def climb(self): 7 print('猫会爬树') 8 9 class Cat(Animal): 10 def climb(self): 11 print('阿花在树上') 12 13 cat1 = Cat('波斯猫', 'male', 'orange') 14 cat1.climb() 15 阿花在树上
如果想同时使用子类和父类相同的方法,则有两种方式:
1 class Animal: 2 def __init__(self, varieties, sex, color): 3 self.varieties = varieties 4 self.sex = sex 5 self.color = color 6 def climb(self): 7 print('猫会爬树') 8 9 class Cat(Animal): 10 def climb(self): 11 print('阿花在树上') 12 13 定义一个鸟的类 14 class Bird(Animal): 15 def __init__(self,fly): 16 self.fly = fly 17 18 cat1 = Cat('波斯猫', 'male', 'orange') 19 b1 = Bird('老鹰', 'female', '黄色', '100KM') # 这样执行会报错,原因是Bird这个类中只要两个参数,却传了5个参数TypeError: __init__() takes 2 positional arguments but 5 were given,解决办法是在Bird这个类中去将父类中的__init__引用过了
第一种方法:
父类名.方法名(参数)
1 class Bird(Animal): 2 def __init__(self, varieties, sex, color, fly): 3 Animal.__init__(self, varieties, sex, color) 4 self.fly = fly 5 6 b1 = Bird('老鹰', 'female', '黄色', '100KM/h') 7 print(b1.__dict__) # {'varieties': '老鹰', 'sex': 'female', 'color': '黄色', 'fly': '100KM/h'}
第二种方法:
super().方法名(参数)
1 super().方法名(参数) 2 class Bird(Animal): 3 def __init__(self, varieties, sex, color, fly): 4 super().__init__(varieties, sex, color) # 常用方法 5 self.fly = fly 6 7 b1 = Bird('老鹰', 'female', '黄色', '100KM/h') 8 print(b1.__dict__) 9 {'varieties': '老鹰', 'sex': 'female', 'color': '黄色', 'fly': '100KM/h'} 10 11 class Cat(Animal): 12 def climb(self): 13 super().climb() 14 print('阿花在树上抓鸟') 15 16 cat1 = Cat('波斯猫', 'male', 'orange') 17 cat1.climb() # 先执行父类中的‘猫会爬树’ 后执行子类中的‘阿花在树上抓鸟’
新式类的单继承:
1 class A: 2 def test(self): 3 print('A') 4 5 class B(A): 6 def test(self): 7 print('B') 8 9 class C(B): 10 def test(self): 11 print('C') 12 13 c1 = C() # 实例化C则先打印C里面的内容,C没有则就去找B,B没有则去找A,如果A还没有的话,则最后找object类 14 print(C.mro()) 15 继承顺序:[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
新式类的多继承:
1 class A: 2 def test(self): 3 print('A') 4 5 class B(A): 6 def test(self): 7 print('B') 8 9 class C(A): 10 def test(self): 11 print('C') 12 13 class D(B): 14 def test(self): 15 print('D') 16 17 class E(C): 18 def test(self): 19 print('E') 20 21 class F(D,E): 22 23 def test(self): 24 print('F') 25 26 print(F.mro()) 27 继承顺序:[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]