python基础------继承特性

目录

 

一、定义

1.定义:

2.在Python3 中一个类没有继承另一个类,自动继承object类

二、继承语法

1.语法:

2.类的分类:

3.查看继承的父类

1.格式:

三、方法的复写

1.定义:

2.什么时候使用复写:

四、super()方法

1.调用父类中和子类相同的父类方法

调用父类方法一:super().eat()

 调用父类方法二:父类名.方法(对象名)

调用父类方法三:super(子类名,对象名).方法名()

五、__init__()方法

六、派生属性

1.派生属性定义:

2.属性的覆盖:

七、私有方法和私有属性继承中的表现

1.父类中的私有方法和私有属性都是不能被子类继承的

2.一般情况下,父类中的属性和方法都不是私有的,都可以让子类继承

八、抽象类

1.抽象类:

2.定义抽象类格式:

九、多继承

1.多继承定义:

2.语法:

十、继承原理(钻石继承)

1.继承原理:


一、定义

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值