python中的继承

本文详细介绍了Python中的继承特性,包括继承的概念、子类与父类、继承的作用,以及如何创建Dog和Cat类并重用代码。进一步探讨了查看继承的父类、方法的复写、super()的使用,特别是如何在子类中调用父类方法。此外,还讲解了init()方法、派生属性以及私有属性和方法在继承中的表现。

一、继承特性

1、什么是继承

继承就是让类和类之间产生父子关系,子类可以拥有父类的静态属性和方法。
[继承就是可以获取另外一个类中的静态属性和普通方法。(并非所有成员)]
在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。
注意:python中的继承分为:单继承和多继承。

2、继承中的子类和父类的概念

父类:用于被继承的类,称之为父类,也叫做基类,或者超类。
子类:继承其他类的类,称之为子类,也叫做派生类。

3、继承的作用

就是提高代码的重用率

创建一个Dog类和一个Cat类

在这里插入图片描述

如上代码所示:我们发现有重复代码

使用继承方式,实现Dog类和Cat类重复代码的重用

class Animal:

    def eat(self):
        print('吃。。。')

    def sleep(self):
        print('睡觉')


class Dog(Animal):

    def bark(self):
        print('汪汪汪')


class Cat(Animal):

    def climb_tree(self):
        print('爬树。。')


dog = Dog()
dog.eat()
dog.sleep()
dog.bark()
cat = Cat()
cat.eat()
cat.sleep()
cat.climb_tree()

在这里插入图片描述

4.查看继承的父类

格式:类名.bases
注意:
(1).python3中如果一个类没有继承任何类,默认继承object类。我们管这种类叫做新式类。
(2).object类,是python中的祖宗,所有的类都是从object类中继承下来的。

print(Cat.__bases__)
print(Dog.__bases__)
print(Animal.__bases__)

输出为:

(<class '__main__.Animal'>,)
(<class '__main__.Animal'>,)
(<class 'object'>,)

5.方法的复写

子类中定义了和父类中相同的方法,我们叫做方法的复写(派生方法)。实例对象调用此方法 的时候就会调用自己类中的方法了。

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 eat(self):
        print('吃狗粮。。。')


dog = Dog('京东狗', 1)
dog.eat()

输出为:

吃狗粮。。。

在这里插入图片描述

6.super()

子类和父类有相同的方法,如果子类想调用父类相同的的方法。可以使用super()方法。
在python3中,子类执行父类的方法也可以直接用super方法 —>super()
super默认省略了两个参数 第一个参数是类名,第二个参数是self。两个参数可以省略不传递例如 super(Student,self)
super()还可以从类的外部使用 需要传递类名(本类的名称)和对象名
例如 super(Student,student)
格式:
父类类名.方法名称(self) 或者 super().方法名称()或者super(本类类名,对象名)

1、子类调用自己的方法的时候同时调用父类的方法

class Animal:

    def eat(self):
        print('吃。。。')

    def sleep(self):
        print('睡觉')


class Dog(Animal):

    def eat(self):
        print('吃狗粮。。。')
        super().eat()


dog = Dog()
dog.eat()

输出为:

吃狗粮。。。
吃。。。

如上代码所示,就是在那个类方法里添加super().方法名()

2、在类的外部调用super()

class Animal:

    def eat(self):
        print('吃。。。')

    def sleep(self):
        print('睡觉')


class Dog(Animal):

    def look_house(self):
        print('看大门。。。')

    def eat(self):
        # super().eat()
        print('吃狗粮。。。')


dog = Dog()
dog.eat()
super(Dog,dog).eat()

输出为:

吃狗粮。。。
吃。。。

如上代码所示,在最后添加super(类名,实例对象名).方法名()

7.init()方法

  • 子类继承父类,如果子类不复写父类的__init__()方法,
    创建子类对象的时候会自动调用父类__init__()方法。
  • 子类继承父类,如果子类复习了父类的__init__()方法,
    创建的子类对象的时候不会再调用父类的__init__() 方法。
  • 注意:python要求复习父类的__init__()方法时,需要调用父类的__init__()
    因为存在隐患,例如父类的初始化方法有参数,子类初始化无参数,子类再调用父类的参数的时候就会报错。
class Person(object):
    def __init__(self):
        print('person...')


class Student(Person):
    def __init__(self):
        print('student...')


student = Student()

输出为:

student...

8.派生属性

属性的覆盖(派生属性):
1.子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类)
2.一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了(属性的覆盖)

class Person(object):
    num = 10

    def __init__(self, name):
        self.name = name


class Student(Person):
    num = 20

    def __init__(self, name, age):  # age就是派生属性
        super().__init__(name)
        self.name = name
        self.age = age


student = Student('zs', 10)
print(student.name)
print(student.num)

输出为:

zs
20

如上代码所示,此时age就是派生属性

9.私有属性及方法在继承中的表现

父类中的私有方法和私有属性都是不能被子类继承下来的。

class Person(object):
    num = 10
    __num1 = 20

    def __test1(self):
        print('__test1...')

    def test2(self):
        print('person test2')


class Student(Person):

    def test(self):
        print('xxx')
        print(Student.num)
        # print(Student.__num1)  # 不能被继承下来

    def test3(self):
        print('test3...')
        self.test2()
        # self.__test1() # 父类的私有方法是不能被继承下来的。


student = Student()
student.test()
student.test2()
student.test3()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值