首页 > 其他分享 >43.继承

43.继承

时间:2023-11-17 15:58:26浏览次数:27  
标签:show 继承 子类 self 43 print 父类

继承

继承是面向对象编程中的三大概念之二,指的是一个类基于另一个类来创建。

创建出来的新类称为子类或派生类。被继承的类称为父类或基类。

通过继承,子类可以继承父类的属性和方法,并且可以在此基础上添加新的属性和方法,或者对继承的属性和方法进行修改。

继承的主要特点包括:

  1. 继承关系:继承创建了一个父类和子类之间的关系。子类继承了父类的特性,包括属性和方法。子类可以重用父类的代码,减少了代码的冗余。

  2. 子类的扩展:子类可以在继承父类的基础上,添加新的属性和方法。这样可以对父类进行扩展,使得子类具有更多的功能。

  3. 代码共享和重用:通过继承,子类可以共享父类的代码。父类中通用的属性和方法可以被多个子类继承和使用,提高了代码的重用性,并减少了开发时间和成本。

  4. 继承的层次结构:继承可以形成一个层次结构,其中一个父类可以有多个子类,而子类又可以成为其他子类的父类。这种层次结构可以更好地组织和管理代码,使得代码更加结构化和模块化。

继承的优势包括:

  1. 代码重用:继承允许子类重用父类的代码,减少了代码的冗余,提高了代码的可维护性和复用性。

  2. 扩展性:通过继承,子类可以在父类的基础上添加新的属性和方法,实现对父类的扩展,使得子类具有更多的功能。

  3. 类型的兼容性:由于子类继承了父类的特性,子类可以被当作父类的实例来使用。这样,在需要父类类型的地方,可以使用子类的实例,增加了代码的灵活性和可扩展性。

需要注意的是,虽然继承可以提供代码重用和扩展的好处,但过度使用继承可能导致代码的复杂性和耦合性增加。因此,在设计代码时,应该合理使用继承,并遵循单一责任原则和开闭原则,保持代码的简洁和灵活。

单继承

单继承是指一个子类只继承一个父类。

class A(object):
# A 继承自object 的根类
def show(self):
print('父类A的方法')


class B(A):
# B类 继承自 A类
def display(self):
print('子类B的方法')

b = B()
# 子类对象使用自己的方法
b.display()
# 子类对象使用父类的方法,如果父类有没有该方法则继续向上查找,直到根类
b.show()

方法重写

在子类中,可以对父类中的方法实现进行重写,实现新的功能实现。

class A(object):
# A 继承object根类
def show(self):
print('父类A的方法')
class B(object):
# 子类重写父类方法
def show(self):
print('子类B的方法')

b = B()
# 当子类方法与父类方法同名时,调用子类方法
b.show()

super()

如果在子类中还要使用父类中的方法,可以使用 super()函数来调用父类中的方法。

比如在重写父类方法时,还要保留父类方法的功能。

class A(object):
# A 继承自object 根类
def show(self):
print('父类A的方法')


class B(A):
# 子类重写父类的方法
def show(self):
# 使用super调用父类方法
super().show()
print('子类B的方法')


b = B()
# 当子类方法与父类方法同名时,调用子类方法
b.show()

单继承的初始化

在子类对象初始化时,需要给出父类初始化所需的参数,然后使用 super() 调用父类初始化方法去初始化父类的属性。

class A(object):
# A继承自object根类
def __init__(self, a):
self.a = a


class B(A):
def __init__(self, a, b):
super().__init__(a)
self.b = b

b = B('A','B')
print(b.a)
print(b.b)

继承的访问控制

无论在方法的重写,还是初始化时,父类的工作就让父类自己去完成,子类只负责自己部分的实现。

比如:如果在初始化时,想在子类中初始化父类的一个私有属性,这是不能实现的,但是可以调用父类的初始化方法对私有属性进行初始化

class A(object):
# A 继承自object根类
def __init__(self, a, b, c):
self.a = a
self._b = b
self.__c = c

def show(self):
print(f"A: {self.a}")
print(f'B: {self._b}')
print(f'C: {self.__c}')


class B(A):
def __init__(self, a, b, c, d):
super().__init__(a, b, c)
self.d = d

def show(self):
super().show()
print(f"D: {self.d}")


b = B(1, 2, 3, 4)
b.show()

多继承

多继承是指一个子类可以同时继承多个父类,此时子类同时拥有多个父类中的属性和方法

class FA(object):
def fa_show(self):
print("FA Show Run")

class FB(object):
def fb_show(self):
print("FB Show Run")

class S(FA, FB):
def s_show(self):
print('S Show Run')

s = S()
s.s_show()
s.fb_show()
s.fa_show()

多继承同名方法查找顺序

如果在一个子类所继承的多个父类中,具有同名方法,那么在调用该方法名的方法时,Python 会使用C3算法实现的 MRO(方法解析顺序)顺序来确定查找的先后顺序,一般情况可以理解成是按继承类的书写顺序。

class FA(object):
def show(self):
print('FA Show Run...')

class FB(object):
def show(self):
print('FB Show Run ...')

class S(FA, FB):
def s_show(self):
print('S Show Run ...')

s = S()
s.s_show()
s.show()

多继承初始化

在多继承中,由于有多个父类,每个父类的属性都需要单独初始化,这时 super() 函数只能引用继承书写顺序上的第一个父类,其它的父类是无法通过 super()引用的,所以也就无法利用 super()函数进行初始化。

此时,可以使用直接指定父类名的方式调用该父类中的方法。

此方法也适用于多继承中的方法重写。

class FA(object):
def __init__(self, a):
self.a = a


class FB(object):
def __init__(self, b):
self.b = b


class S(FB, FA):
def __init__(self, a, b, c):
FA.__init__(self, a)
FB.__init__(self, b)
self.c = c


s = S(1, 2, 3)
print(s.a)
print(s.b)
print(s.c)

标签:show,继承,子类,self,43,print,父类
From: https://www.cnblogs.com/csfsz/p/17838801.html

相关文章

  • Java实现学生类继承自human类
    编写人类Human,包括私有姓名、性别、年龄,定义获取各个字段的公共方法,再定义公共的构造方法和思考方法。编写继承人类的学生类Student,增加私有的学号字段以及公共的获取学号的方法,还有公共的构造方法、学习方法,并重写toString方法获取学生数据。最后定义测试类,构造若干个学生对象......
  • C#中的类和继承
    ......
  • c语言学习(文件)练习43
    需求:将10000以二进制的形式存入文件中#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inta=10000; FILE*pf=fopen("D:\\桌面\\test.txt","wb"); fwrite(&a,1,1,pf); fclose(pf); pf=NULL; return0;} ......
  • add方法在return的适时候就形成了一个闭包,包含n=4399这个值,这个n不是result和result2
    在浏览器控制台中执行以下代码,输出的结果是functiontest(){varn=4399;functionadd(){n++;console.log(n);}return{n:n,add:add}}varresult=test();varresult2=test();result.add();result.add();console.log(result.n)......
  • Python类对象:属性、继承与多继承
    在Python中,类是创建对象的蓝图。类定义了如何创建对象,并决定了这些对象的属性和行为。本博客将深入探讨Python类对象的属性、继承以及多继承。属性属性是类的特性,它定义了对象的状态。每个对象都有其自己的属性副本。python复制代码classPerson:def__init__(self,name,a......
  • 在 Angular 中,Controller 之间通信的方式主要有三种:作用域继承仅限于上下级之间的通信
    AngularJS中control间通信最好使用什么方式?A回调B全局变量C广播D函数调用正确答案:C在Angular中,Controller之间通信的方式主要有三种:1)作用域继承。利用子Controller控制父Controller上的数据。2)注入服务。把需要共享的数据注册为一个service,在需要的Controlle......
  • java 继承中的访问特点已经方法的重构
    packagenet.elaina.a01oopextensdemo2;publicclassTest{publicstaticvoidmain(String[]args){//利用空参构造创建子类对象Ziz1=newZi();z1.ziShow();}}classFu{Stringname="Fu";}classZiextendsFu{......
  • CF1436E Complicated Computations 题解
    CF1436EComplicatedComputationsmex的定义是:一个区间中没有出现过的数中最小的整数。对于一个区间,当正整数x在区间中没有出现过、[1,x-1](整数)在区间中全部出现过,那么正整数x就是该区间的mex正整数x在区间中没有出现过我们一共有n个数字,所有的数字都不出现一次,就一共有n次......
  • Java之继承的详解一
     3.1概述3.1.1引入假如我们要定义如下类:学生类,老师类和工人类,分析如下。学生类属性:姓名,年龄行为:吃饭,睡觉老师类属性:姓名,年龄,薪水行为:吃饭,睡觉,教书班主任属性:姓名,年龄,薪水行为:吃饭,睡觉,管理如果我们定义了这三个类去开发一个系统,那么这三个类中就存在大量重......
  • P4310 绝世好题
    P4310绝世好题基础思路类似\(LIS\)。但只有\(80pts\)for(inti=1;i<=n;++i) { for(intj=1;j<i;++j) { if(s[i]&s[j])f[i]=max(f[i],f[j]+1); } }优化时间一种很妙的剪枝。因为\(F_i\)都是由\(\max(F_j+1)\)转移而来,可以用一个数组维护上一轮转......