继承

一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法。属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就是顶级基类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__()。最常见的魔术方法就是初始化和析构了,下面介绍几种另外的魔术方法。

运算方法:运算方法可以实现类之间的运算,方便类之间的操作。

  1. __add__(self,other) #x + y
  2. __sub__(self,other)#x - y
  3. __mul__(self,other)#x * y
  4. __mod__(self,other)#x % y
  5. __iadd__(self,other)# x += y
  6. __isub__(self,other)# x -= y
  7. __radd__(self,other)#y + x
  8. __rsub__(self,other)#y - x
  9. __imul__(self,other)#x *= y
  10. __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类的继承、多继承及其常用魔术方法的更多相关文章

  1. Python中的常用魔术方法介绍

    1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初 ...

  2. python常用魔术方法概览

    构造和初始化 __init__(self, args) 构造函数 __new__(cls) 传入的是类实例 __del__(self) 析构函数,调用 del cls 时会被调用 属性访问控制 __g ...

  3. [Python3 填坑] 014 类的常用魔术方法举例

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __init__() 2.2 __new__() 2.3 __call__() 2.4 __str__() 2.5 __repr__() ...

  4. php中的常用魔术方法总结

    以下是对php中的常用魔术方法进行了详细的总结介绍,需要的朋友可以过来参考下 常用的魔术方法有:__Tostring () __Call() __autoLoad() __ clone() __GET ...

  5. python类学习以及mro--多继承属性查找机制

    版权声明:本文为博主原创文章,未经博主允许不得转载. 还记得什么是新式类和旧式类吗? Python中,一个class继承于object,或其bases class里面任意一个继承于object,这个c ...

  6. Python面向对象5:类的常用魔术方法

    魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发- 魔术方法的统一的特征,方法名被前后各两个下滑线包裹 - 操作类 - `__init__`: 构造函数 - `__new__`: 对象实例 ...

  7. 简述 Python 类中的 __init__、__new__、__call__ 方法

    任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使用.垃圾回收,不同的阶段由不同的方法(角色)负责执行. 定义一个类时,大家用得最多的就 ...

  8. Python 基础之面向对象之常用魔术方法

    一.__init__魔术属性 触发时机:实例化对象,初始化的时候触发功能:为对象添加成员,用来做初始化的参数:参数不固定,至少一个self参数返回值:无 1.基本用法 #例:class MyClass ...

  9. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

随机推荐

  1. js基础学习之-js对象的属性

    Js属性 1. 设置属性 1)  对象. 2)  对象[‘属性名’] 3)   GetAttribute函数 2. 获取属性 1)  变量=对象. 2)  变量=对象[‘属性名’] 3)  GetAt ...

  2. UVA - 1149 Bin Packing(装箱)(贪心)

    题意:给定N(N<=10^5)个物品的重量Li,背包的容量M,同时要求每个背包最多装两个物品.求至少要多少个背包才能装下所有的物品. 分析:先排序,从最重的开始装,如果重量小于M,则如果能装一个 ...

  3. jQuery琐碎

    函数(以click事件为例)在jsp页面和js中的不同写法 onclick="getInfo(this);" function getInfo(obj){ var $this=$( ...

  4. Python学习——enumerate

    enumerate(seq, start) seq -- 可遍历的序列      start -- 下标起始位置 seq = [11,22,33,44,55] for i in seq: print( ...

  5. Spring注解@ResponseBody

    @Responsebody 将内容或对象作为http响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流. 写在方法上面表示:表示该方法的返回结果直接写 ...

  6. [题解] Luogu P4245 [模板]任意模数NTT

    三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说 ...

  7. socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

    出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen( ...

  8. 吴裕雄--天生自然 JAVASCRIPT开发学习:字符串

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Linux学习打卡20200214

  10. 《Java核心技术卷I》观赏指南

    Tomxin7 如果你有想看书的计划,但是还在纠结哪些书值得看,可以简单看看"观赏指南"系列,本文会简单列出书中内容,给还没有买书的朋友提供一个参考. 前言 秋招过去很久了,虽然在 ...