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. Chrome报错提示Unchecked runtime.lastError: The message port closed before a response was received.

    经过查询,此错误是Chrome扩展插件引起的.由于Chrome修改了API接口,原来的请求被拦截.(Chrome 73 onwards disallows cross-origin requests ...

  2. laravel博客中文章删除遇到问题

    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'blog_article.id' in 'where clause' (SQL: sel ...

  3. 【原创】谈一个数学教育专业的IT职业生涯

    2003年,有许多值得记住,第一个是非典,第二个就是高考数学卷.直到今年2019年,时隔16年,有人说2019年高考数学卷难度堪比2003年,但还没难到2003年的程度. 我,2003年高考,进考场先 ...

  4. Codevs 4373 窗口(线段树 单调队列 st表)

    4373 窗口 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只 ...

  5. Java中indexOf的用法

    indexOf有四种用法: 1.indexOf(int ch) 在给定字符串中查找字符(ASCII),找到返回字符数组所对应的下标找不到返回-1 2.indexOf(String str)在给定符串中 ...

  6. 两列布局实现各自独立滚屏,类似与 scrollNav 的功能。

    现在移动端 web 开发越来越靠近 app 的功能.所以两列布局各自都能实现独立滚动也常见.基于固定侧边栏导航,另一侧实现内容展示. 这个功能的核心在于使用 vh 单位. 其中 CSS 的代码是核心点 ...

  7. Zabbix 4.0.2试用(七):在Linux主机中安装zabbix agent并添加该主机(yum源安装)

    Zabbix 4.0.2试用(七):在Linux主机中安装zabbix agent并添加主机(yum源安装) 2018年12月20日, 上午6:42 之前介绍的是下载源安装包,编译安装的方式来安装ag ...

  8. linux 查看系统性能

    1. 查看内存和CPU信息 cat /proc/cpuinfo                   cpu信息 cat /proc/meminfo |grep MemTotal    内存信息 查看物 ...

  9. springboot中如何启动tomcat

    springboot启动时,会自动识别出当前环境是否是web环境还是非web环境. 默认的web环境的context(DEFAULT_WEB_CONTEXT_CLASS):org.springfram ...

  10. python3笔记二十:时间操作time

    一:学习内容 time时间戳 time元组 time字符串 time时间转换图解 二:time 需要引入:import time 1.概念 UTC(世界协调时间):格林尼治天文时间,世界标准时间,在中 ...