1、python子类调用父类成员有2种方法,分别是普通方法和super方法

class Base(object):  #基类的表示方法可以多种,Base(),Base,Base(object),即新式类与经典类
def __init__(self):
print('Base create')
class childA(Base):
def __init__(self):
print("\n")
print('creat A ')
Base.__init__(self) #简单调用父类成员
class childB(Base):
def __init__(self):
print("\n")
print('creat B ')
super(childB, self).__init__()#super调用父类成员
#使用super()继承时不用显式引用基类
base = Base()
a = childA()
b = childB()

输出:

Base create

creat A
Base create creat B
Base create

2、在子类中重写父类方法,采用super()继承

class FooParent(object):
def __init__(self):
self.parent = 'I\'m the parent.'
print('Parent')
def bar(self, message):
print(message, 'from Parent') class FooChild(FooParent):
def __init__(self):
super(FooChild, self).__init__()
# super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类B的对象 FooChild 转换为类 FooParent 的对象
print('Child')
def bar(self, message):
super(FooChild, self).bar(message) #重写父类的方法
print('Child bar fuction')
print(self.parent)
if __name__ == '__main__':
fooChild = FooChild()
fooChild.bar('HelloWorld')

输出:

Parent
Child
HelloWorld from Parent
Child bar fuction
I'm the parent.

3、复杂场景的类继承(钻石继承)

# 砖石继承采用super(),防止了基类被初始化两次
# 其先采用广度搜索,找到基类,顺序为:Leaf()——>Medium1——>Medium2——>Base
# 其初始化的顺序为:Base——>Medium2——>Medium1——>Leaf
class Base(object):
def __init__(self):
print("Base") class Medium1(Base):
def __init__(self):
super(Medium1, self).__init__()
print("Medium1") class Medium2(Base):
def __init__(self):
super(Medium2, self).__init__()
print("Medium2") class Leaf(Medium1, Medium2):
def __init__(self):
super(Leaf, self).__init__()
print("Leafinit")
Leaf()

输出:

Base
Medium2
Medium1
Leafinit

4、类的方法

# 1、实例方法:只能通过实例调用,实例方法第一个定义的参数只能是实例本身引用

class Myclass:
def foo(self):
print(id(self),'foo') a = Myclass() # 既然是实例对象,那就要创建实例
a.foo() # 输出类里的函数地址
print(id(a)) # 输出类对象的地址
# 结果地址一样 print("******************************") # 2、类方法:定义类方法,要使用装饰器@classmethod,定义的第一个参数是能是类对象的引用,
# 可以通过类或者实例直用
class Myclass:
@classmethod # 类装饰器
def foo2(cls):
print(id(cls),'foo2')
#类对象,直接可以调用,不需要实例化
print(id(Myclass),'classmethod')
Myclass.foo2()#直接使用类名可以调用 print("******************************") # 3、静态方法:定义静态方法使用装饰器@staticmethod,没有默认的必须参数,
# 通过类和实例直接调用
class Myclass:
@staticmethod # 静态方法
def foo3():
print('foo3')
Myclass.foo3() # 没有参数
# 结果foo3 输出:
2197397372264 foo
2197397372264
******************************
2197777487112 classmethod
2197777487112 foo2
******************************
foo3

简单场景的类继承、复杂场景的类继承(钻石继承)、super、类的方法的更多相关文章

  1. 继承+派生+分类+钻石继承(day20)

    目录 昨日内容 面对对象编程 类 定义类时发生的事情 调用类时发生的事情 init 对象 对象查找类的属性的顺序 对象的绑定方法 python中万物皆对象 今日内容 继承 什么是继承 为什么要继承 如 ...

  2. 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)

    组合 什么有什么的关系 一个类的对象作为另一个类的对象继承 子类可以使用父类中的名字(静态属性 方法)抽象类和接口类 只能不继承,不能被实例化 子类必须实现父类中的同名方法———规范代码 metacl ...

  3. cocos2d-X学习之主要类介绍:场景(CCScene)

    场景(CCScene) 类结构: CCScene主要有以下两个函数: bool  init () //初始化函数 static CCScene *  node (void) //生CCScene 作为 ...

  4. python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)

    先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...

  5. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

  6. C++ Pirmer : 第十五章 : 面向对象程序设计之基类和派生的定义、类型转换与继承与虚函数

    基类和派生类的定义以及虚函数 基类Quote的定义: classs Quote { public: Quote() = default; Quote(cosnt std::string& bo ...

  7. 场景:A-->B-->C 跳转到C时,要关掉B的处理方法

    场景:A-->B-->C 跳转到C时,要关掉B的处理方法:相当于从A跳转到C UIViewController *preController = [self.navigationContr ...

  8. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...

  9. 4-13 object类,继承和派生( super) ,钻石继承方法

    1,object 类 object class A: ''' 这是一个类 ''' pass a = A() print(A.__dict__) # 双下方法 魔术方法 创建一个空对象 调用init方法 ...

随机推荐

  1. vue基本知识点概括

    目录 Vue 渐进式 JavaScript 框架 一.走进Vue 1.what -- 什么是Vue 2.why -- 为什么要学习Vue 3.special -- 特点 4.how -- 如何使用Vu ...

  2. FastDFS为什么要结合Nginx?

    为什么选择Nginx Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟 ...

  3. linux系统下nginx/mysql/php启动、停止、重启命令

    /usr/local/nginx/sbin/nginx /etc/init.d/mysql start /usr/local/php/sbin/php-fpm start   #nginx命令     ...

  4. 顺序表应用8:最大子段和之动态规划法(SDUT 3665)

    Problem Description 给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a ...

  5. vue 钩子函数的使用

    1.什么是自定义指令,有哪些钩子函数及自定义指令的使用场景 ①自定义指令是什么?以及自定义指令的使用场景 在Vue中,有很多内置指令,但是这些指令只能满足我们最基础的使用,当我们在实际项目中遇到了必须 ...

  6. Latex里引用多个公式,如何将公式合并?

    如果是想要的效果:(1)-(3),怎么操作?类似于用\cite引用多个文献那样吗? 1. \eqref{lable 1, lable 2, label 3}? 得到的结果:3个问号 ??? 2.\eq ...

  7. git 出现错误 Could not resolve host: github.com 或者 gitlab.com 或者gerrit相关( 自有服务 )

    原来是因为github.com没有被主机给解析 1.第一步是 ping 你的gitlab 或者 github服务器ip地址 如果每隔几秒有 time = xx.ms 刷新 就证明是通的 2. 编辑 e ...

  8. 教程:myeclipse在线安装svn插件

    SVN 版本控制,相信开发过程中都很多有用到,今天在myeclipse 在线安装了SVN插件.下面是具体步骤,记录下,希望对有需要的朋友提供帮助. 要求: Myeclispe,电脑能连接互联网 步骤: ...

  9. jmeter参数化之 CSV data set config

    第一步:测试计划右键--创建线程组   第二步:选择线程组:右键--sample---创建:http request 配置协议类型和服务名称,method 和path 第三步:选择线程组下的http ...

  10. C++入门经典-例9.3-类模板,简单类模板

    1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类 ...