zoukankan      html  css  js  c++  java
  • 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'
  • 相关阅读:
    [转]难过的时候看看,也许会豁然开朗
    热爱生活
    [转]MTOM 编码
    11/16
    11/10 The Day Before Single's Day
    About working overtime
    hehe
    The First Blog
    配置MapServer出现的一些问题及解决办法
    Ubuntu 系统下终端快捷键设置
  • 原文地址:https://www.cnblogs.com/emily-qin/p/7059638.html
Copyright © 2011-2022 走看看