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__()。最常见的魔术方法就是初始化和析构了,下面介绍几种另外的魔术方法。

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

  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'>)

 

posted @ 2018-09-21 22:12  龙~白  阅读(464)  评论(0编辑  收藏  举报