089 重用父类方法的两种方式

目录

  • 一、直接调用指定类的方法
  • 二、通过super()关键字
    • 2.1 使用方法
    • 2.2 使用super调用父类方法
    • 2.3 super()的调用顺序

重用父类方法有两种方式:

  1. 指名道姓的使用,直接调用指定类的方法
  2. super关键字使用

一、直接调用指定类的方法

  • 指名道姓的使用,跟继承没有关系。但也能完成需求
class Person:
    school = 'xxx'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def study(self):
        print('study....')

class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):
        # 直接调用Person类的__init__方法
        Person.__init__(self,name,age)
        self.course=course
    def study(self):
        Person.study(self)
        print("%s学生在学习"%self.name)

stu1=Student('wed',19,"Python")
# stu1.school='xxx'
print(stu1.school)
stu1.study()

yyyy
study....
wed学生在学习

二、通过super()关键字

首先,super()是用来调用父类(超类)的一个方法

它的调用顺序是根据 对象的mro()方法中的调用顺序来进行调用的

2.1 使用方法

super()的使用方法,在python2和python3中并不相同。

  • 新式类的写法:

    super().__init__(参数1,参数2) # 新式类,调用父类的init方法并传参
  • 经典类的写法:
    super(当前类名,self).__init__(参数1,参数2) # 经典类,调用父类的init方法并传参

2.2 使用super调用父类方法

class Person(object):
    school = 'xxx'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def study(self):
        print('study....')

class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):
        #super() 会按照mro列表拿到父类对象
        #对象来调用绑定方法,不需要传递第一个参数(self)
        super().__init__(name,age)
        #经典类和新式类
        #经典类中必须这么写(py3中没有经典类),都用上面那种方式写
        # super(Student,self).__init__(name,age)
        self.course=course
    def study(self):
        # Person.study(self)
        super().study()
        # print("%s学生在学习"%self.name)

stu1=Student('wed',19,"Python")
# stu1.school='xxx'
# print(stu1.school)
stu1.study()

2.3 super()的调用顺序

牢记:它的调用顺序是根据 对象的mro()方法中的调用顺序来进行调用的

# super是按照mro列表找
class A:
    def f1(self):
        print('A.f1')
class B:
    def f1(self):
        print('B.f1')
    def f2(self):
        print('B.f2')

        # 重点
        super().f1()

class C(B,A):
#注意这个顺序,这个顺序报错
# class C(A,B):
    def f1(self):
        print('C.f1')

#C实例化产生一个对象
c=C()
# print(c.f2())
print(C.mro())
c.f2()

[<class ‘main.C‘>, <class ‘main.B‘>, <class ‘main.A‘>, <class ‘object‘>]
B.f2
A.f1

原文地址:https://www.cnblogs.com/XuChengNotes/p/11419215.html

时间: 2024-08-26 08:10:18

089 重用父类方法的两种方式的相关文章

【转】BAT启动执行JAVA JAR文件中的MAIN方法的两种方式

A .导出runnable jar 1. Eclipse导出选择Runnable JAR,选择执行的Main入口函数,执行 java -jar Test.jar,Jar包内包含清单文件,记录了引用到的Jar包和所需要执行的main函数所在的类  2. 如上操作会生成一个Test.jar和包含所有引用的第三方库包的Test_lib文件夹,在Jar包同级目录放入写好命令的Bat文件,执行得到 @echo offtitle test echo start exejava -jar hello.jarp

直接调用对象方法的两种方式

关于直接调用方法和给对象发送消息调用方法(即perfromSelector和NSInvocation) performSelector是运行时系统负责去找方法的,在编译时候不做任何校验:如果直接调用编译是会自动校验.如果imageDownloader:didFinishWithImage:image:不存在,那么直接调用 在编译时候就能够发现(借助Xcode可以写完就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃):Cocoa支持在运行时向某个类添加方法

Python之面向对象的组合、多态、菱形问题、子类中重用父类的两种方式

一.组合 ''' 1.什么是组合 组合就是一个类的对象具备某一个属性,该属性的值是指向另外一个类的对象 2.为何用组合 组合也是用来解决类与类直接代码冗余问题的 3.如何用组合 ''' # 继承减少代码冗余,但是将类与类进行了强耦合,python不崇尚,所以能不用继承就尽量不用继承 class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age se

多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比

Thread.Start(),ThreadPool.QueueUserWorkItem都是在实现多线程并行编程时常用的方法.两种方式有何异同点,而又该如何取舍? 写一个Demo,分别用两种方式实现.观察各自的现象. 一个WorkMan class,其内的method doSomething()是每次异步线程调用的方法.该方法只是随机的让线程休眠一段时间. 1 public void doSomething() 2 { 3 OnBegin(new EventArgs()); 4 5 // some

Android提交数据到服务器的两种方式四种方法

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传递进来的数据,以map的形式进行了封装 * @p

python全栈脱产第34天------开启进程的两种方式、join方法、进程对象其他相关的属性和方法、僵尸进程、孤儿进程、守护进程、互斥锁

一.开启进程的两种方式 方式一: from multiprocessing import Processimport time def task(name): print('%s is running' %name) time.sleep(3) print('%s is done' %name) # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中if __name__ == '__main__': p=Process(target=t

创建线程的两种方式

首先我们需要知道什么是线程:是程序执行流的最小单元,包括就绪.阻塞和运行三种基本状态. 举个简单的例子:我们把生活中的两件事吃饭和写作业当作是两个线程,当你正在写作业的时候,爸妈叫你吃饭,你就直接去了,等吃完饭回来后再接着写作业.这就是相当于两个线程其中一个从运行状态转入就绪状态,另一个线程从就绪状态转入运行状态. 创建线程包括继承Thread类和实现Runnable接口两种方式(JDK5.0以后还包括了实现Callable等方式来实现线程,这里不做介绍,感兴趣的小伙伴可以自己查资料),下面介绍

创建线程的两种方式比较Thread VS Runnable

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端