加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

python面向对象-继承

(2022-03-30 15:06:03)
分类: Python学习
转自:https://www.toutiao.com/article/7080532448853180943/

python面向对象-继承

原创2022-03-30 10:58·HyRer

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类


python中类的继承分为:单继承和多继承


class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

查看继承__bases__

_base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类


>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
(<<span class="hljs-class" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px;">class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<<span class="hljs-class" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px;">class '__main__.ParentClass1'>, __main__.ParentClass2'>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。


>>> ParentClass1.__bases__
(<<span class="hljs-class" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px;">class 'object'>,)
>>> ParentClass2.__bases__
(<<span class="hljs-class" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px;">class 'object'>,)

继承与重用性

在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时

我们不可能从头开始写一个类B,这就用到了类的继承的概念。

通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用


class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''

    def __init__(self, name, age):
        self.name = name  # 人和狗都有自己的昵称;
        self.age = age  # 人和狗都有自己的年龄;

    def eat(self):
        print('%s is eating' % self.name)


class Dog(Animal):
    pass


class Person(Animal):
    pass


egg = Person('小明', 10)
ha2 = Dog('小白', 1)
egg.eat()
ha2.eat()

提示:用已经有的类建立一个新的类,这样就重用了已经有的软件中的一部分设置大部分,大大节省了编程工作量,这就是常说的软件重用,不仅可以重用自己的类,也可以继承别人的,比如标准库,来定制新的数据类型,这样就是大大缩短了软件开发周期,对大型软件开发来说,意义重大.

派生


当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。


class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''

    def __init__(self, name, age, hobby):
        self.name = name  # 人和狗都有自己的昵称;
        self.age = age  # 人和狗都有自己的年龄;
        self.hobby = hobby  # 人和狗都有自己的爱好;

    def eat(self):
        print('%s is eating' % self.name)


class Dog(Animal):
    '''
    狗类,继承Animal类
    '''

    def bite(self, people):
        """
        派生:狗有咬人的功能
        :param people:
        :return:
        """
        print(f"{self.name} bit a people, {people.name}")


class Person(Animal):
    '''
    人类,继承Animal
    '''

    def play(self, dog):
        '''
        派生:人有娱乐的功能
        :param dog:
        '''
        print(f"{self.name} play with the dog, {dog.name}")

    def eat(self):
        print(f"{self.name} 在吃好吃的")


xm = Person('小明', 10, "girl")
xb = Dog('小白', 50, "bone")
xm.play(xb)
xm.eat()
xb.bite(xm)
xb.eat()
"""
小明 play with the dog, 小白
小明 在吃好吃的
小白 bit a people, 小明
小白 is eating
"""

注意:像xm.name之类的属性引用,会先从实例中找name然后去类中找,然后再去父类中找...直到最顶级的父类。

在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值.

在python3中,子类执行父类的方法也可以直接用super方法.


class A:
    def hahaha(self):
        print('A')

class B(A):
    def hahaha(self):
        super().hahaha()
        #super(B,self).hahaha()
        #A.hahaha(self)
        print('B')

a = A()
b = B()
b.hahaha()
super(B,b).hahaha()


通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师


#在继承中
#继承的语法:
# class 类名(父类名):
# 想在子类中实现调用父类的方法
    #在类内 ——super(子类名,self).方法名()
    #在类外面 ——super(子类名,对象名).方法名()
#如果不指定继承的父类,默认继承object
#子类可以使用父类的所有属性和方法
    #如果子类有自己的方法就执行自己的的
    #如果是子类没有的方法就执行父类的
    #如果子类父类都没有这个方法就报错

#继承、抽象、派生
#继承 是从大范围到小范围
#抽象 小范围到大范围
#派生 就是在父类的基础上又产生子类——派生类
        #父类里没有的 但子类有的 ——派生方法
        #派生属性
#方法的重写
    #父类里有的方法,在子类里重新实现

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有