目录
2.在Python3 中一个类没有继承另一个类,自动继承object类
2.一般情况下,父类中的属性和方法都不是私有的,都可以让子类继承
一、定义
1.定义:
让类和类之间产生父子关系,子类可以拥有父类的属性和方法,但是私有属性不能继承
可以获取另一个类的静态属性和普通方法
2.在Python3 中一个类没有继承另一个类,自动继承object类
二、继承语法
1.语法:
子类(父类名)
2.类的分类:
旧式类,经典类:class Animal
新式类:class Animal(object)
旧式类和新式类都默认继承object
class Animal:
type='动物'
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('吃.....')
def sleep(self):
print('睡.....')
class Dog(Animal):
def look_door(self):
print('看门....')
class Cat(Animal):
def climb_tree(self):
print('爬树.....')
dog=Dog('京东狗',8)
print(dog.type)#可以调用属性
dog.eat()
dog.sleep()
dog.look_door()
cat=Cat('天猫',10)
cat.eat()
cat.sleep()
cat.climb_tree()
#结果:
动物
吃.....
睡.....
看门....
吃.....
睡.....
爬树.....
3.查看继承的父类
1.格式:
类名.__bases__
object类是Python中的祖宗,所有类都是从object类中继承下来的
class Animal:
type='动物'
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('吃。。。。')
def sleep(self):
print('睡。。。')
class Dog(Animal):
def look_door(self):
print('看门。。。。')
class Cat(Animal):
def climb_tree(self):
print('爬树。。。')
print(Cat.__bases__)
print(Dog.__bases__)
结果:
(<class '__main__.Animal'>,)
(<class '__main__.Animal'>,)
三、方法的复写
1.定义:
子类中定义了和父类中相同的而方法,叫做复写
2.什么时候使用复写:
当父类的方法不能满足子类的需求时,就可以使用复写方法
复写后只能调用自己定义的方法,不能调用父类的方法
class Animal:
type='动物'
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('吃.....')
def sleep(self):
print('睡.....')
class Dog(Animal):
def look_door(self):
print('看门.....')
def eat(self):
print('吃狗粮....')
class Cat(Anmial):
def climb_tree(self):
print('爬树n.....')
dog=Dog('京东狗',8)
dog.eat()
dog.sleep()
dog.look_door()
cat=Cat('天猫',10)
cat.eat()
cat.sleep()
cat.climb_tree()
#结果:
吃狗粮。。。。
睡。。。
看门。。。。
吃。。。。
睡。。。
爬树。。。
吃狗粮。。。。
吃。。。。
四、super()方法
1.调用父类中和子类相同的父类方法
(1).super()方法----->super().方法名().//这种方法只能在内部调用
(2).父类名.方法名(对象名)----->//既可以在内部使用,也可以在外部使用
(3).super(子类名,对象).方法名()------->既可以在内部使用也可以在外部使用
调用父类方法一:super().eat()
class Animal:
type='动物'
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('吃.....')
def sleep(self):
print('睡.....')
class Dog(Animal):
def look_door(self):
print('看门......')
def eat(self):
super().eat()#调用父类
print('吃狗粮.....')
class Cat(Animal):
def Climb_tree(self):
print('爬树.....')
dog=Dog()
dog.eat()
#结果:
#吃.....
#吃狗粮......
调用父类方法二:父类名.方法(对象名)
class Animal:
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('吃。。。。')
def sleep(self):
print('睡。。。。')
class Dog(Animal):
def look_door(self):
print('看门.....')
def eat(self):
#Animal.eat(dog)#在内部调用父类
print('吃狗粮。。。。')
class Cat(Animal):
def climb_tree(self):
print('爬树......')
dog=Dog('京东狗',10)
Animal.eat(dog)#在类外部调用父类
dog.eat()
#结果:
# 吃。。。。
# 吃狗粮。。。。
调用父类方法三:super(子类名,对象名).方法名()
class Animal(object):
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print('吃。。。。')
def sleep(self):
print('睡。。。。')
class Dog(Animal):
def look_door(self):
print('看门....')
def eat(self):
super(Dog,dog).eat()
print('吃狗粮。。。。')
class Cat(Animal):
def climb_tree(self):
print('爬树....')
dog=Dog('京东狗',8)
dog.eat()
#结果:
# 吃。。。。
# 吃狗粮。。。。
五、__init__()方法
1.如果子类不复写__init__()方法,自动调用父类__init()__方法
2.如果子类复写了__init__()方法,不会自动调用父类的__init__方法。不推荐使用,在后面写上super().__init__()
3.推荐显示调用的父类的方法------>super().__init__()
4.注意:python要求复写类的__init__()方法时,需要调用父类的__init__()
因为存在隐患,例如父类的初始化方法有参数,子类初始化无参数,子类再调用父类
的参数的时候就会报错。
1)子类不复写__init__()方法
class Person(object):
def __init__(self):
print('person')
class Stdent(Person):
print('student')
student=Stdent()
#结果:
# student
# person
2)子类复写__init__()方法------->不会调用父类
class Person(object):
def __init__(self):
print('person')
class Stdent(Person):
def __init__(self):#不会调用父类__init__方法
print('student')
student=Stdent()
#结果:
# student
3)子类复写__init__后调用父类__init__方法
class Person(object):
def __init__(self):
print('person')
class Stdent(Person):
def __init__(self):
super().__init__()#调用父类方法
print('student')
student=Stdent()
#结果:
#person
# student
六、派生属性
1.派生属性定义:
子类中添加的新属性(新添加的变量)
2.属性的覆盖:
子类和父类有相同属性的时候调用自己类中的属性
class Person(object):
def __init__(self,name):
print('person...')
class Student(Person):
def __init__(self,name,age):
super().__init__(name)#先调用父类,在调用子类
self.name=name
self.age=age
print('student')
student=Student('zs',10)
#结果:
# person...
# student
七、私有方法和私有属性继承中的表现
1.父类中的私有方法和私有属性都是不能被子类继承的
2.一般情况下,父类中的属性和方法都不是私有的,都可以让子类继承
class Person(object):
num=10
__num=1#私有静态属性
def __test1(self):#私有静态方法
print('__test1...')
def test2(self):
print('person test2')
class Student(Person):
def test(self):
print('xxxx')
print(Student.num)
#print(Student.__num)#私有属性不能被继承
#self.test2()#内部调用test2 ,因为已经被继承下来,等价于本身隐藏一份,可以直接调用
#self.__test1()父类中的私有方法不能被继承下来的
student=Student()
student.test()
student.test2()#外部调用test2
八、抽象类
1.抽象类:
是一个特殊的类,只能被继承,不能实例化,只有定义方法,不实现方法体
2.定义抽象类格式:
(1):from abc import ABCMeta , abstractmethod
在需要使用抽象类的方法上写上@abstractmethod
(2):import abc
在需要使用抽象类的方法上写上@abc.abstractmethod
from abc import ABCMeta ,abstractmethod
#抽象类
class Animal (metaclass=ABCMeta):
@abstractmethod
def eat(self):pass
@abstractmethod
def sleep(self):pass
#可以定义普通的方法
def play(self):
print('转悠。。。。。')
'''如果用抽象类,子类中必须复写全部父类中的使用抽象方法的方法'''
class Dog(Animal):
def eat(self):
print('吃狗粮。。。')
def sleep(self):
print('轻轻的睡觉')
pass
dog=Dog()
dog.eat()
dog.sleep()
dog.play()
九、多继承
1.多继承定义:
一个子类可以继承多个父类,拥有所有父类的属性和方法
2.语法:
子类名(父类名1,父类名2...):pass
class A(object):
num_a=10
def test1(self):
print('A test1')
def test2(self):
print('A test2')
class B(object):
num_b=20
def test1(self):
print('B test3')
def test4(self):
print('B test4')
# class C(A,B):#先找C类中,在找离C类近的类,A类,如果还没有再找B,在找object
# pass
# c=C()
# c.test1()#A test1
class C(B,A):
pass
# c=C()
# c.test1()#B test3
print(C.mro())#使用mro方法来搜索类的路径
十、继承原理(钻石继承)
1.继承原理:
先检查子类,在检查父类。如果父类存在两个相同的选择,选择第一个父类
class A(object):
def test(self):
print('A test')
class B(A):
def test(self):
print('B test')
class C(A):
def test(self):
print('C test')
class D(B,C):
def test(self):
print('D test')
d=D()
d.test()
#结果
D test