继承

一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法。属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就是顶级基类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. javaBean命名属性时的小注意点

    javabean属性命名的时,第一个和第二个字母最好不要是大写字母,不然使用eclipse自动生成getter和setter方法时,会出现奇怪的问题,导致struts2封装属性的封装不上. priva ...

  2. cf 507E. Breaking Good

    因为要求是在保证最短路的情况下花费是最小的,所以(先保证最短路设为S吧) 那么花费就是最短路上的新建边条数A+剩余拆掉边的条数B,而且总的原有好的边是一定的,所以,只要使得A尽量小,那么B就大,所以要 ...

  3. BZOJ:3231: [Sdoi2008]递归数列

    题解: 矩阵乘法,在矩阵中构造当前前缀和: 注意:for(int/long long ;;); #include<iostream> #include<cstdio> #inc ...

  4. POJ-3262 贪心的一个小技巧

    Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3204   Accepted: ...

  5. 浪潮服务器raid5-echo转义说明

    https://jingyan.baidu.com/article/4ae03de3e4c8d33eff9e6bee.html https://wenku.baidu.com/view/3c5dc9a ...

  6. VScode 修改中文字体

    打开vscode ctrl+,打开设置 找到font,第一个是首选的英文字体,第二个是中文字体.

  7. js事件函数中function(e){}

    简单来说就是指向了当前发生的事件(click.mouseover等等),保存了当前事件的信息.如鼠标点击事件,有鼠标的坐标信息.其中,e是标准浏览器传递进去的事件参数,低版本IE不会传递,事件参数放置 ...

  8. APP中H5页面调试神器

    Fiddler Web Debugging Tool for Free by Telerik window 可以 下载,然后我的H5 嵌入到 APP 里面就可以快速捕捉到接口啦.不会因为看不见就得靠“ ...

  9. Integer和int的区别

    1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer ...

  10. fastreport小入门

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...