简单场景的类继承、复杂场景的类继承(钻石继承)、super、类的方法
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、类的方法的更多相关文章
- 继承+派生+分类+钻石继承(day20)
目录 昨日内容 面对对象编程 类 定义类时发生的事情 调用类时发生的事情 init 对象 对象查找类的属性的顺序 对象的绑定方法 python中万物皆对象 今日内容 继承 什么是继承 为什么要继承 如 ...
- 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)
组合 什么有什么的关系 一个类的对象作为另一个类的对象继承 子类可以使用父类中的名字(静态属性 方法)抽象类和接口类 只能不继承,不能被实例化 子类必须实现父类中的同名方法———规范代码 metacl ...
- cocos2d-X学习之主要类介绍:场景(CCScene)
场景(CCScene) 类结构: CCScene主要有以下两个函数: bool init () //初始化函数 static CCScene * node (void) //生CCScene 作为 ...
- python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)
先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...
- python开发面向对象基础:接口类&抽象类&多态&钻石继承
一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...
- C++ Pirmer : 第十五章 : 面向对象程序设计之基类和派生的定义、类型转换与继承与虚函数
基类和派生类的定义以及虚函数 基类Quote的定义: classs Quote { public: Quote() = default; Quote(cosnt std::string& bo ...
- 场景:A-->B-->C 跳转到C时,要关掉B的处理方法
场景:A-->B-->C 跳转到C时,要关掉B的处理方法:相当于从A跳转到C UIViewController *preController = [self.navigationContr ...
- java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...
- 4-13 object类,继承和派生( super) ,钻石继承方法
1,object 类 object class A: ''' 这是一个类 ''' pass a = A() print(A.__dict__) # 双下方法 魔术方法 创建一个空对象 调用init方法 ...
随机推荐
- axios时遇到的Request Method: OPTIONS
前言 在请求axios 请求数据的时候,会出现options的,是因为请求是分为简单请求和复杂请求. 简单请求 满足下面两个条件的请求是简单请求: 请求方式是以下三种之一: HEAD GET POST ...
- 关于C# Dockpanel的一些入门的基本操作
关于C# Dockpanel的一些入门的基本操作 原文链接:https://blog.csdn.net/Lc1996Jm/article/details/51881064 一.引用: 1.建立一个Wi ...
- hdu 6068 Classic Quotation
题 QAQ http://acm.hdu.edu.cn/showproblem.php?pid=6068 2017 Multi-University Training Contest - Team 4 ...
- PHP处理kafka消息队列
在安装php-kafka 扩展后,就可以开始编写 php 消费消息的脚本了,php-rdkafka 扩展提供了几种消息处理的方式 低级方式(Low level) 这种方式没有消费组的概念 <?p ...
- Centos7 内核升级及删除无用内核
导入key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 安装elrepo的yum源 rpm -Uvh http://www.e ...
- 关于自定义sparkSQL数据源(Hbase)操作中遇到的坑
自定义sparkSQL数据源的过程中,需要对sparkSQL表的schema和Hbase表的schema进行整合: 对于spark来说,要想自定义数据源,你可以实现这3个接口: BaseRelatio ...
- hbase hbck
Number of Tables: 7Number of live region servers: 3Number of dead region servers: 0Number of empty R ...
- js中的事件委托技术
1.什么是事件委托:通俗的讲,时间就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个时间本来是加在某些元素上的,然而你却加到别人身上来做,完成这 ...
- layui按回车键实现表单提交
layui中标准用法如下: <form class="layui-form"> <input type="button" id="q ...
- ambari部署Hadoop集群(2)
准备本地 repository 1. 下载下面的包 wget http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.7.3 ...