1.继承引入,减少代码量
1)版本1:
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog:
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----")
def bark(self):
print("-----汪汪叫---") a = Animal()
a.eat() wangcai = Dog()
wangcai.eat()
----吃----
----吃----
2)版本2:继承动物类
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----")
'''
def bark(self):
print("-----汪汪叫---") a = Animal()
a.eat() wangcai = Dog()
wangcai.eat()
3)版本3:
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Cat(Animal):
def catch(self):
print("---抓老鼠---")
a = Animal()
a.eat() wangcai = Dog()
wangcai.eat() tom = Cat()
tom.eat()
2.子类继承父类的父类
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----") xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
---飞----
-----汪汪叫---
----吃----
3.重写
先在自己的类中查找父类的同名方法,没有的话去父类查找
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----")
def bark(self): #定义和父类方法同名的方法,就是重写
print("---重写叫---") xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
---飞----
---重写叫---
----吃----
4.调用被重写的方法
既要调用父类的方法,又要重写该方法
1)版本1: Dog.bark(self)
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----")
def bark(self):
print("---重写叫---") #第一种调用被重写的父类的方法
Dog.bark(self) xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
---飞----
---重写叫---
-----汪汪叫---
----吃----
2)版本2:super().dark()
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----")
def bark(self):
print("---重写叫---") #第一种调用被重写的父类的方法
# Dog.bark(self) #第2种
super().bark() #super()高级的,上级的 xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
5.私有属性私有方法,不能被直接继承
私有属性私有方法可以被公有方法调用,公有方法可以被继承
1)版本1:
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") class B(A):
pass b = B()
b.test1()
b.__test2() #私有方法不会被继承 print(b.num1)
print(b.__num2) #私有属性不会被继承
---test1---
Traceback (most recent call last):
File "09-私有在继承中的表现.py", line 17, in <module>
b.__test2() #私有方法不会被继承
AttributeError: 'B' object has no attribute '__test2'
2)版本2:
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") class B(A):
pass b = B()
b.test1()
#b.__test2() #私有方法不会被继承 print(b.num1)
#print(b.__num2) #私有属性不会被继承
---test1---
100
3)版本3:通过公有方法调用
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") def test3(self):
self.__test2()
print(self.__num2) class B(A):
pass b = B()
b.test1()
#b.__test2() #私有方法不会被继承 print(b.num1)
#print(b.__num2) #私有属性不会被继承 b.test3() #公有方法调用私有属性方法
---test1---
100
--test2---
222
4)版本4:
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") def test3(self):
self.__test2()
print(self.__num2) class B(A):
def test4(self):
self.__test2()
print(self.__num2) b = B()
b.test1()
#b.__test2() #私有方法不会被继承 print(b.num1)
#print(b.__num2) #私有属性不会被继承 b.test3()
b.test4()
---test1---
100
--test2---
222
Traceback (most recent call last):
File "09-私有在继承中的表现.py", line 29, in <module>
b.test4()
File "09-私有在继承中的表现.py", line 18, in test4
self.__test2()
AttributeError: 'B' object has no attribute '_B__test2'
6.多继承
经典类
class Dog:
pass
新式类 object是所有类的父类
class Dog(object):
pass
多继承
class Base(object):
def base(self):
print("----this is base-") class A(Base):
def test1(self):
print("---this is A---") class B(Base):
def test2(self):
print("----this is B---") class C(A,B):
pass c1 = C()
c1.test1()
c1.test2()
c1.base()
---this is A---
----this is B---
----this is base-
7.多继承注意点
切记:不要出现相同的方法名
1)版本1:先调用自身的
class Base(object):
def test(self):
print("----this is base-") class A(Base):
def test(self):
print("---this is A---") class B(Base):
def test(self):
print("----this is B---") class C(A,B):
def test(self):
print("----this is C---") c1 = C()
c1.test()
----this is C---
2)版本2:调用哪个父类的AorB??
class Base(object):
def test(self):
print("----this is base-") class A(Base):
def test(self):
print("---this is A---") class B(Base):
def test(self):
print("----this is B---") class C(A,B):
pass
# def test(self):
# print("----this is C---") c1 = C()
c1.test()
---this is A---
3)版本3:调用顺序
class Base(object):
def test(self):
print("----this is base-") class A(Base):
def test(self):
print("---this is A---") class B(Base):
def test(self):
print("----this is B---") class C(A,B):
pass
# def test(self):
# print("----this is C---") c1 = C()
c1.test()
print(C.__mro__)