Python之面向对象:继承

概念:子类继承父类的属性和方法。
一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
一、单继承 :推崇。特点和使用
eg:
class Parent(object):
parentAttr = 100
def __init__(self):
print 'Calling parent constructor'
self.name='dengxiaoping'
def parentMethod(self):
print 'Calling parent method'
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print 'Parrent attribute:',Parent.parentAttr
 
class Child1(Parent):
def __init__(self):
print 'Calling child1 constructor'
def childMethod(self):
print 'Calling child1 method'
Parent.parentMethod(self)
class Child2(Parent):
def childMethod(self):
print 'Calling child2 method'
self.parentMethod()
 
1、父类构造方法的继承
c1=Child1()
这一句是创建实例对象时,就会自动去调类的构造方法__init__进行初始化工作,如果子类中没有实现构造方法__init__,就会直接调用父类的构造方法
c1=Child1() #Calling child1 constructor
Child1() 创建实例对象:子类中有自己的构造函数,所以父类的构造函数不在起作用
print c1.name 报错
print c1.parentAttr #100 类属性直接继承过来
c2=Child2() #Calling parent constructor
Child2() 子类中没有构造方法,完全继承父类的构造方法,
print c2.name #dengxiaoping
总结:构造方法需要在其派生类的构造方法中专门调用,即子类不会主动继承基类的构造方法。
2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
子类调用父类的方法有两种方式:
1、Parent.parentMethod(self)
2、self.parentMethod()
第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的是,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向这个类的实例本身。这种方法多用于方法重写时。
第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的公有方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。
class Child1(Parent):
def __init__(self):
print 'Calling child1 constructor'
def childMethod(self):
print 'Calling child1 method'
Parent.parentMethod(self) #调用基类的方法,所以要加上参数self
这里:Parent.parentMethod(self)可以使用self.parentMethod()替换,
class Child2(Parent):
def childMethod(self):
print 'Calling child2 method'
self.parentMethod() #子类调用自己从父类那继承过来的父类的方法
 
 
3、在子类中引用父类的构造方法:
(1)superclassname.__init__(self,params) 尽量使用第一种
(2)super(subclassname,self).__init__(params) 这一种不支持多继承
class Child1(Parent):
def __init__(self):
Parent.__init__(self)
print 'Calling child1 constructor'
第二种:
class C(A):
def __init__(self):
super(C, self).__init__() #调用基类构造方法
 
4、通过构造方法,把变量从子类传到父类
如果基类构造方法需要传入参数时,创建子类的实例对象时,就必须传入对应的参数,否则会报参数数量不匹配的错。
class Parent(object):
parentAttr = 100
def __init__(self,name,age):
print 'Calling parent constructor'
self.name = name
self.age = age
 
class Child1(Parent):
def __init__(self,name,age):
Parent.__init__(self,name,age)
print 'Calling child1 constructor'
 
5、通过实例方法,把变量从子类传到父类
def parentMethod(self,name):
print 'Calling parent method'
print 'your old name is %s'%self.name
print 'your new name is %s'%name
 
def childMethod(self,name):
print 'Calling child1 method'
Parent.parentMethod(self,name)
 
6、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找需要调用的方法,找不到才去基类中找)
新式类按照广度优先去查找,继承object的是新式类
经典类按照深度优先的方式去查找
 
7、子类只继承父类所有公有的属性和方法,并且也可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。
 
8、继承的本质
对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
 
二、类间的关系判断
isinstance() 判断是否是实例
issubclass() 判断是否是子类
isinstance(c1,Child1)
issubclass(Child1,Parent)
issubclass(Child1,object)
 
三、多重继承:不建议使用多继承
一个子类继承多个父类
调用父类构造函数:superclassName.__init__(self, [parameter1[,parameter2....]] )
调用父类中的函数:Parent.parentMethod(self)
class D(object):
def bar(self):
print 'D.bar'
 
class C(D):
def __init__(self):
print 'B init'
def bar(self):
print 'C.bar'
 
class B(D):
def __init__(self):
print 'B init'
def bar(self):
print 'B.bar'
 
class A(B,C): 多重继承
def bar(self):
print 'A.bar'
a1=A() # B init 多重继承时,默认继承的第一个父类的构造方法
 
class A(B,C):
def __init__(self):
B.__init__(self)
C.__init__(self)
D.__init__(self)
def bar(self):
print 'A.bar'
原文地址:https://www.cnblogs.com/emily-qin/p/7059638.html