python类的继承、多继承及其常用魔术方法
继承
一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法。属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就是顶级基类object,它就相当于一个人的祖宗。当一个类没有写继承谁时,默认就是继承object。
class father(object):
def __init__(self):
self.name = "wang"
self.__age = 20
def A(self):
print(self.__age)
class son(father):
pass
a = son()
print(a.name)
a.A()
wang
20
上面代码中,son类继承了father类,所以可以直接使用父类的属性和方法。
多继承
一个类可以同时继承多个类,这个就是类的多继承。当继承多个父类时,如果父类中有相同的方法,那么子类会优先使用最先被继承的方法。下面的例子可以明显地看出来。
class father():
def __init__(self):
self.name = "wang"
self.__age = 20
def A(self):
print("this is father\'s method")
class mother():
def __init__(self):
self.sex = "man"
def A(self):
print("this is mother\'s method")
class son(father,mother):
pass
a = son()
a.A()
this is father's method
当子类不想调用父类的方法,可以通过重写来覆盖父类的方法。
class father():
def __init__(self):
self.name = "wang"
self.__age = 20
def A(self):
print("this is father\'s method")
class mother():
def __init__(self):
self.sex = "man"
def A(self):
print("this is mother\'s method")
class son(father,mother):
def A(self):
print("this is my method")
a = son()
a.A()
this is my method
当子类重写父类方法后,若想再次调用父类方法,可以使用super()方法。还可以调用类的__mro__属性(返回元组)或mro方法(返回列表)来获取类的继承关系。
class father():
def __init__(self):
self.name = "wang"
self.__age = 20
def A(self):
print("this is father\'s method")
class mother():
def __init__(self):
self.sex = "man"
def A(self):
print("this is mother\'s method")
class son(father,mother):
def A(self):
super().A()
a = son()
a.A()
print(son.mro())
print(son.__mro__)
this is father's method
[<class '__main__.son'>, <class '__main__.father'>, <class '__main__.mother'>, <class 'object'>]
(<class '__main__.son'>, <class '__main__.father'>, <class '__main__.mother'>, <class 'object'>)
魔术方法
类的魔术方法有很多,所谓的魔术方法就是不需要自己调用,就可以自己再特定的时刻被自动调用,魔术方法的形式时__name__()。最常见的魔术方法就是初始化和析构了,下面介绍几种另外的魔术方法。
运算方法:运算方法可以实现类之间的运算,方便类之间的操作。
- __add__(self,other) #x + y
- __sub__(self,other)#x - y
- __mul__(self,other)#x * y
- __mod__(self,other)#x % y
- __iadd__(self,other)# x += y
- __isub__(self,other)# x -= y
- __radd__(self,other)#y + x
- __rsub__(self,other)#y - x
- __imul__(self,other)#x *= y
- __imod__(self,other)#x %= y
class A():
def __init__(self):
self.number = 20
def __add__(self,other):
return self.number + other.number
def __sub__(self,other):
return self.number - other.number
class B():
def __init__(self):
self.number = 30
a = A()
b = B()
print (a+b)
print (a-b)
50
-10
__call__方法:正常情况下,实例是不能像函数一样被调用的,但通过写__call__方法就能做到。
class A():
def __init__(self):
self.number = 20
def __call__(self):
print("this call method")
a = A()
a()
this call method
类中一些查询相关信息的方法,这些方法基本了解就行,实际中并不常用。
- __class__ 格式:实例.__class__
- __dict__ 格式:实例.__dict__
- __doc__ 格式:类名.__doc__
- __bases__ 格式:类名.__bases__
- __mro__ 格式:子类名.__mro__
class father():
def __init__(self):
self.name = "wang"
self.__age = 20
def A(self):
print("this is father\'s method")
class mother():
def __init__(self):
self.sex = "man"
def A(self):
print("this is mother\'s method")
class son(father,mother):
def A(self):
super().A()
a = son()
print (a.__class__)#查看类名
print (a.__dict__)#查看全部属性,返回属性和属性值键值对形式
print (son.__doc__)#查看对象文档
print (son.__bases__)#查看父类
print (son.__mro__)
<class '__main__.son'>
{'name': 'wang', '_father__age': 20}
None
(<class '__main__.father'>, <class '__main__.mother'>)
(<class '__main__.son'>, <class '__main__.father'>, <class '__main__.mother'>, <class 'object'>)
python类的继承、多继承及其常用魔术方法的更多相关文章
- Python中的常用魔术方法介绍
1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初 ...
- python常用魔术方法概览
构造和初始化 __init__(self, args) 构造函数 __new__(cls) 传入的是类实例 __del__(self) 析构函数,调用 del cls 时会被调用 属性访问控制 __g ...
- [Python3 填坑] 014 类的常用魔术方法举例
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __init__() 2.2 __new__() 2.3 __call__() 2.4 __str__() 2.5 __repr__() ...
- php中的常用魔术方法总结
以下是对php中的常用魔术方法进行了详细的总结介绍,需要的朋友可以过来参考下 常用的魔术方法有:__Tostring () __Call() __autoLoad() __ clone() __GET ...
- python类学习以及mro--多继承属性查找机制
版权声明:本文为博主原创文章,未经博主允许不得转载. 还记得什么是新式类和旧式类吗? Python中,一个class继承于object,或其bases class里面任意一个继承于object,这个c ...
- Python面向对象5:类的常用魔术方法
魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发- 魔术方法的统一的特征,方法名被前后各两个下滑线包裹 - 操作类 - `__init__`: 构造函数 - `__new__`: 对象实例 ...
- 简述 Python 类中的 __init__、__new__、__call__ 方法
任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使用.垃圾回收,不同的阶段由不同的方法(角色)负责执行. 定义一个类时,大家用得最多的就 ...
- Python 基础之面向对象之常用魔术方法
一.__init__魔术属性 触发时机:实例化对象,初始化的时候触发功能:为对象添加成员,用来做初始化的参数:参数不固定,至少一个self参数返回值:无 1.基本用法 #例:class MyClass ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
随机推荐
- abstract和interface关键字介绍
一.abstract关键字介绍 abstract可以修饰方法.类.使用abstract修饰的方法和类分别叫做抽象方法和抽象类. 1.抽象方法 抽象方法的定义:指可以通过abstract关键字声明的方法 ...
- Apache nifi 第二篇(小白初试) nifi数据对接流程初次尝试
一.准备工作 1.官网下载nifi 2.上传到linux随便哪里把,因为nifi是用java写的,所以首先要保证你的linux装了jdk 其次保证系统在装了zookeeper,因为nifi是一个分布 ...
- linux 命令之 objdump 简单使用
objdump 介绍 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具 objdump 选项介绍 --archive-headers -a 显示档案库的成员信息,类似ls -l ...
- Spring AOP 基本的使用
1. jar包 2.全局配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...
- Arduino --structure
The elements of Arduino (C++) code. Sketch loop() setup() Control Structure break continue do...whil ...
- SqlServer 集合运算符
1.集合运算符概述 (1)集合运算符运用与集合之间的运算. (2)多元集合: 指的是来自两个输入查询的集合,可能包含重复项 (3)T-SQL 支持三种集合运算符 union .intersect .e ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 基本语法
C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色.名称.品种,行为 - 摇动.叫唤.吃.对象是类的实例. 类 - 类可 ...
- LeJOS下eclipse通过USB连接EV3
适用情况:在eclipse安装好LeJOS插件后,再通过USB连接EV3. 第一:更新驱动 在<设备管理器-网络适配器>下更新RNDIS/Ethernet Gadget,电脑需要先连接EV ...
- DP背包问题学习笔记及系列练习题
01 背包: 01背包:在M件物品中取出若干件物品放到背包中,每件物品对应的体积v1,v2,v3,....对应的价值为w1,w2,w3,,,,,每件物品最多拿一件. 和很多DP题一样,对于每一个物品, ...
- 用Python在00:00给微信好友发元旦祝福语
2019年的元旦即将来临,这里用Python撸一串简单的代码来实现定点给微信里的所有小伙伴发祝福语 环境说明 Python版本: 不限 第三方库: itchat, schedule 注:所有祝福语来源 ...