继承:
实现代码的重用,相同的代码不需要重复的编写。
其中子类中拥有父类的所有方法和属性。
当父类的方法不能满足子类需求时,可对方法进行重写
重写的方法有:
1、覆盖父类的方法
2、对父类方法进行扩展。
单继承
一、覆盖父类的方法
在子类中定义一个与父类同名的方法且实现,重写之后,在运行时,只会调用子类中重写的方法,而不会调用父类的方法。
class Dog():
def bark(self):
print("汪汪吠叫")
dog=Dog()
dog.bark()
class Xiaotianquan(Dog):
def fly(self):
print("飞")
def bark(self):
print("吠叫声很大")
xtq=Xiaotianquan()
xtq.bark()
汪汪吠叫
吠叫声很大
二、对父类方法进行扩展
1、像之前一样重写子类
2、super(程序后面会给你自动添加
3、针对子类的需求编写子类代码
class Xiaotianquan(Dog):
def fly(self):
print("飞")
def bark(self):
print("吠叫声很大")
super(Xiaotianquan, self).bark()
print("&*&%")
吠叫声很大
汪汪吠叫
&*&%
2.访问私有属性和方法
1、在外界不能直接访问父类的私有属性/调用私有方法
class A():
def test(self):
self.num=100
self.__num2=200
def __test(self):
print("私有方法{}{}".format(self.num,self.__num2))
class B(A):
pass
b=B()
print(b)
print(b.__num2)
AttributeError: 'B' object has no attribute '__num2'
class B(A):
def demo(self):
#1.在子类的对象方法中,不能访问父类的私有属性
print("访问父类的私有属性{}".format(self.__num2))
#2.在子类的对象方法中,调用父类的私有方法
self.__test()
2、子类可以通过父类的公有方法间接访问到私有属性和方法。由于私有属性和方法是对象的隐私,不对外公开,外界和子类都不能直接访问。
父类有一个公有方法test,在这个test方法中访问自己的属性num,__num2.然后在公有方法里面调用自己的私有方法——test
因此作为子类对象是可以调用父类的公有方法的。
例子:
class A():
def __init__(self):
self.num=100
self.__num2=400
def __test(self):
print("父类的私有属性是输出num{} 与__num2 {}的值".format(self.num,self.__num2))
def test(self):
print("父类的公有方法 {}".format(self.__num2))
print("这一步完成后调用父类自己的私有方法")
self.__test()#父类自己可以调用自己的方法
class B(A):
def demo(self):
print("子类方法 {}".format(self.num))
self.test()
b=B()
print(b.demo())
多继承:
可以让子类对象同时拥有多个父类的属性和方法
语法:
class 子类名(父类a,父类b):
pass
class A():
def test(self):
print("A类的继承方法")
class B():
def demo(self):
print("B类的继承方法")
class C(A,B):
pass
c=C()#创建了子类对象
c.test()
c.demo()
A类的继承方法
B类的继承方法
问题的提出,如果多个父类有相同的属性和方法,怎么处理呢?
—尽量避免使用多继承
程序只执行最前面的父类
class A():
def test(self):
print("A类----test方法")
def demo(self):
print("A类-----demo方法")
class B():
def test(self):
print("B类----test方法")
def demo(self):
print("B类-----demo方法")
class C(A,B):
pass
c=C()
c.test()
c.demo()
结果如下;
A类----test方法
A类-----demo方法
class C(B,A):
pass
结果如下:
B类----test方法
B类-----demo方法
简单了解python中的内置方法__mro__(方法搜索顺序)
输出结果按照从左到右的顺序查找
...
print(C.__mro__)
B类----test方法
B类-----demo方法
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
3、由于python2与python3的区别,我们在定义类的时候如果没有父类,采用object
格式如下;
class 类名(object)
pass
在终端中可以用dir函数查看。