继承

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

最新文章

  1. ASP.NET开源CMS
  2. msql,触发器无事物回滚,插入之前满足条件再插入
  3. ACM 16进制的简单运算
  4. win8win10以管理员身份运行cmd方法
  5. [原创]java WEB学习笔记65:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) ModelDriven拦截器 paramter 拦截器
  6. Android开发优化
  7. (转)Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题
  8. python正则实例
  9. Android用户界面 UI组件--TextView及其子类(二) Button,selector选择器,sharp属性
  10. CentOS7.1 使用资源搜集
  11. 关于css3的背景切割(background-clip)、背景原点(background-origin)的使用
  12. 开源 免费 java CMS - FreeCMS1.9 职位管理
  13. 关于在Editplus中设置内容提示比如syso的快捷输出的方法
  14. 为什么需要Docker?
  15. 几个NAND/NOR门可以表示一个XOR门?
  16. Android EditText手机号格式化输入XXX-XXXX-XXXX
  17. django项目的新建相关的命令及配置
  18. 面试3——java集合类面试题总结
  19. Dede文章标题长度修改
  20. JoyOI1935 导弹防御塔

热门文章

  1. JavaScript使浏览器不使用缓存
  2. springboot - 返回JSON error 从自定义的 ErrorController
  3. CentOS下的安装命令 安装Nginx 更新yum源 kali系统当中的软件管理命令(第五天)
  4. 洛谷 P5146 最大差值
  5. 2.10 Jetpack LiveData部分
  6. 简单的说一下react路由(逆战班)
  7. 利用IIS6提权获得管理员权限
  8. 【SpringBoot】SpringBoot Web开发(八)
  9. POJ 1995:Raising Modulo Numbers 快速幂
  10. 洛谷 P1018乘积最大