zoukankan      html  css  js  c++  java
  • 四. python面向对象(继承)

    一. 继承

    class A:pass     # 父类   基类   超类
    class B:pass     # 父类   基类   超类
    
    class A_son(A,B): pass    # 子类    派生类
    class AB_son(A):pass  # 子类    派生类
    # 一个类 可以被多个类继承
    # 一个类可以继承多个父类
    
    print(A_son.__bases__)     # 查看类的继承__bases__           (<class '__main__.A'>, <class '__main__.B'>)
    print(AB_son.__bases__)      # 查看类的继承__bases__           (<class '__main__.A'>,)
    
    print(A.__bases__)      # 查看类的继承__bases__    在python 中没有父类   都是 object儿子    (<class 'object'>,)
    class Per(object):
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    class Dog(Per):
            pass
    
    aa=Dog("张三",25,"")
    
    
    print(aa.age) # 25
    print(aa.name)  # 张三
    class Aa(object):
        def __init__(self, name,aggr,hp):
            self.name = name
            self.aggr= aggr
            self.hp=hp
        def eat(self):
            print("吃了啊哈哈哈1111111111111111111111111111111111哈")
    
    
    class Do(Aa):
        def __init__(self, name, aggr,hp,kind):
            Aa.__init__(self,name,aggr,hp)
            self.kind=kind
    
        def eat(self):
            Aa.eat(self)   #  去继承父类的吃的方法  意思是既想实现新的功能 也想使用父类原有的功能 还需要在子类中再调用
            print("222222222222222222222222222222222222222lalalalallaal")
    
    aa=Do("张三",100,22,5)
    
    print(aa.name)  # 张三
    
    print(aa.kind)  # 5
    
    print(aa.aggr) # 100
    
    print(aa.hp)  # 22
    
    aa.eat()  #父类方法 和子类方相同   同时调用了
    # 吃了啊哈哈哈1111111111111111111111111111111111哈
    # 222222222222222222222222222222222222222lalalalallaal
    class Aa(object):
        def __init__(self, name,aggr,hp):
            self.name = name
            self.aggr= aggr
            self.hp=hp
        def eat(self):
            print("吃了啊哈哈哈哈")
    
    
    
    class Do(Aa):
        def __init__(self, name, aggr,hp,kind,lover):
            super().__init__(name, aggr,hp)
            self.kind=kind   # 自己的属性叫派生属性
            self.lover=lover
        def eat(self):
            print("2222222222222222222222222")
    aa=Do("张三",100,22,5,66666666666666)
    aa.eat()   # 这个是调用自己的方法
    
    print(aa.lover)   # 66666666666666
    
    super(Do,aa).eat()     # super 是可以掉用父类的方法  格式 是  super(被继承的类,实例化)
    # 这是爸爸类
    class Baba(object):
        money = 100
    
        def __init__(self, name):
            print("爸爸")
            self.name = name
    
        def da_ren(self):
            print("%s正在打儿子" % self.name)
    
    
    # 儿子类
    class Son(Baba):
        pass
    
    
    print(Son.money) # 100
    print(Baba.__dict__)
    print(Son.__dict__)
    
    # {'__module__': '__main__', 'money': 100, '__init__': <function Baba.__init__ at 0x0000019F1E28B9D8>, 'da_ren': <function Baba.da_ren at 0x0000019F1E28BA60>, '__dict__': <attribute '__dict__' of 'Baba' objects>, '__weakref__': <attribute '__weakref__' of 'Baba' objects>, '__doc__': None}
    # {'__module__': '__main__
    # 这是爸爸类
    class  Baba(object):
          money=100
    
          def __init__(self,name):
    
            self.name=name
    
          def da_ren(self): 
              print("%s正在打儿子"%self.name)
    
    # 儿子类
    class Son(Baba):
        pass
    a1=Son("张三")  
    print(a1.name)     
    print(a1.money)   
    
    
    # 爸爸
    # 张三
    # 100 
    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def run(self,aa):
            print("我喜欢%s是一个"%aa,self.gender)
    
    class Teacher(Person):
        def __init__(self, name, gender, course,age):
            super(Teacher, self).__init__(name, gender)
            self.course = course
            self.age=age
        def suger(self,cc):
            print("我是"+self.name+"喜欢"+self.course+"年龄%s"%cc)
            
        def run(self):
            print("我是子类哈哈哈哈")
    
    
    t = Teacher('张三', '', 'English',"22")
    
    print(t.name) # 张三
    print(t.course)  # English
    print(t.age) # 22
    t.run()   #  如果子类和父类定义的方法名相同时  默认时先调用子类
    t.suger("222222")
    
    # 使用super去调用父类方法
    aa=super(Teacher,t)
    aa.run("3333333333333")
    # 张三
    # English
    # 22
    # 我是子类哈哈哈哈
    # 我是张三喜欢English年龄222222
    # 我喜欢3333333333333是一个 男
    继承一个类:
    如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承:
    
    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    定义Student类时,只需要把额外的属性加上,例如score:
    
    class Student(Person):
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)
            self.score = score
    一定要用 super(Student, self).__init__(name, gender) 去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。
    
    函数super(Student, self)将返回当前类继承的父类,即 Person ,然后调用__init__()方法,注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。
    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def run(self,aa):
            print("我喜欢%s是一个"%aa,self.gender)
    
    class Teacher(Person):
        def __init__(self, name, gender, course,age):
            Person.__init__(self,name, gender)
            self.course = course
            self.age=age
        def suger(self,cc):
            print("我是"+self.name+"喜欢"+self.course+"年龄%s"%cc)
    
        def run(self):
            print("我是子类哈哈哈哈")
    
    
    t = Teacher('张三', '', 'English',"22")
    
    print(t.name) # 张三
    print(t.course)  # English
    print(t.age) # 22
    t.run()   #  如果子类和父类定义的方法名相同时  默认时先调用子类
    t.suger("222222")
    
    # 使用super去调用父类方法
    aa=super(Teacher,t)
    aa.run("3333333333333")
    # 张三
    # English
    # 22
    # 我是子类哈哈哈哈
    # 我是张三喜欢English年龄222222
    # 我喜欢3333333333333是一个 男
    # 温度temperature
    
    # 多态:就是运行时 绑定的状态
    
    class H2o(object):
    
        def __init__(self,name,temperature):
    
            self.name=name
    
            self.temperature=temperature
    
        def turn_ice(self):
    
               if self.temperature<0:
    
                  print("[%s]温度太低结冰了"%self.name)
    
               elif self.temperature>0 and self.temperature<100:
    
                  print("[%s]液化成水"%self.name)
    
               elif self.temperature>100:
    
                  print("[%s]温度太高成水蒸气"%self.name)
       
     #
    class Water(H2o):
        pass
    # 固态
    class Ice(H2o):
        pass  
    # 气态
    class Steam(H2o):
        pass   
    
    a1=Water("",60)
    a2=Ice("",-100)
    a3=Ice("蒸汽",1000000)  
    
    # 就是不同的对象调用相同的方法
    def func(obj):
        obj.turn_ice()  
    func(a1) # [水]液化成水
    func(a2) # [冰]温度太低结冰了
    func(a3) # [蒸汽]温度太高成水蒸气
    # 定义交通工具 地铁
    
    # 速度  speed
    # 乘坐  lood
    # 能源  power
    # # 那条线路     line
    # 定义交通工具
    class Vehicle:
        Country="china"
        def __init__(self, name,speed,load,power):
    
            self.name=name
            self.speed=speed
            self.load=load
            self.power=power
        def run(self):
                print("地铁开动了1111111111111111111111111111111")
    
    # 地铁
    class Subway(Vehicle):  
        
         def __init__(self,name,speed,load,power,line):
            Vehicle.__init__(self,name,speed,load,power)  # 调用父类的方法实例
            self.line=line 
    
         def show_info(self):
             print(self.name,self.line,self.speed,self.load,self.power)
    
         def run(self):
             print("%s %s开的了"%(self.name,self.line))
    
    a=Vehicle("成都地铁","10m/s","500人","")
    a.run()    # 地铁开动了1111111111111111111111111111111
    
    a=Subway("成都地铁","10m/s","500人","","6号线")
    
    a.show_info()   # 成都地铁 6号线 10m/s 500人 电
    a.run()# 成都地铁 6号线开的了
    print(a.Country)# china
    # 定义交通工具 地铁
    
    # 速度  speed
    # 乘坐  lood
    # 能源  power
    # # 那条线路     line
    
    # 定义交通工具
    class Vehicle:
    
        Country="china"
    
        def __init__(self, name,speed,load,power):
    
            self.name=name
            self.speed=speed
            self.load=load
            self.power=power
        def run(self):
                print("地铁开动了1111111111111111111111111111111")
    # 地铁
    class Subway(Vehicle):  
         def __init__(self,name,speed,load,power,line):
            Vehicle.__init__(self,name,speed,load,power)  # 调用父类的方法实例
            self.line=line 
    
         def show_info(self):
             print(self.name,self.line,self.speed,self.load,self.power)
    
         def run(self):
             Vehicle.run(self) # 调用父类的方法
             print("%s %s开的了"%(self.name,self.line))
    
    a=Subway("成都地铁","10m/s","500人","","6号线")
    
    a.show_info()   # 成都地铁 6号线 10m/s 500人 电
    
    a.run()# 成都地铁 6号线开的了
    
    print(a.Country)# china
    
    """Vehicle.__init__(self,name,speed,load,power)
    相当于调用父类的
     def __init__(self, name,speed,load,power):
       
               self.name=name
               self.speed=speed
               self.load=load
               self.power=power"""  

    1. 多继承

    
    
    类名.__mro__方法 查看广度优先的继承顺序
    # 多继承:
    # 按照名字顺序 继承
    # 新式类 :广度优先 类名.mro方法 查看广度优先的继承顺序
    # 经典类 : 深度优先
    class A:
    def func(self):
    print("A")
    class B:
    def func(self):
    print("B")
    class C:
    def func(self):
    print("C")

    class D(A,B,C):
    def func(self):
    print("D")
    f=D()
    f.func()
    print(D.__mro__)
    # <built-in method mro of type object at 0x000001A075553568>
    # (<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
    class A:
      def func(self):
        print("A")
    
    class B:
      def func(self):
          print("B")
    
    class C:
      def func(self):
          print("C")
    
    class D(A,B,C):
       def func(self):
           print("D")
    
    f=D()
    f.func()
    super(D,f).func()

     使用import 来继承(分文件来继承 注意在同一个文件夹下面)

    # per.py  文件
    
    class Per(object):
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def eat(self):
            print("我是吃吃—————我是人类吃———————————>")
    
        def su(self):
            print("我性别是男-----",self.sex)
    # gril.py  文件
    from  per import Per
    class Gr(Per):
        def __init__(self,name,age,sex,money,like):
            super().__init__(name,age,sex)
            self.money=money
            self.like=like
    
    
        def eat(self):
            # Per.eat(self)
            print("我是女子吃吃吃-=========1111111111111111====>")
    
        def o(self):
            print("这是钱",self.money)
    
    
    # son.py  文件
    from  per import Per
    class So(Per):
        def __init__(self,name,age,sex,xi,wa,lan):
            super().__init__(name,age,sex)
            self.xi=xi
            self.wa=wa
            self.lan=lan
    
        def p(self):
            print("我是帅哥了哈哈哈")
    
        def f(self,cc):
            print(self.lan,"---------------比较花钱",cc)
    # mian.py 执行文件
    
    from  gril import Gr
    from  son import  So
    if __name__=="__main__":
        aa=Gr("张三",25,"","20000元","漂亮")
    
        aa.su()                # 我性别是男----- 女
        aa.eat()               # 我是女子吃吃吃-=========1111111111111111====>
        aa.o()                 #   这是钱 20000元
        super(Gr,aa).eat()     # 我是吃吃—————我是人类吃———————————>
        print("***********************************11111111111111111111*******************************************")
    
        bb=So("李四",6666,"","哈哈","222","nice to")
        bb.su()  #  我性别是男----- 男
        bb.eat()#   我是吃吃—————我是人类吃———————————>
        bb.p()#  我是帅哥了哈哈哈
        bb.f("去你妈的哈哈哈哈")#  nice to ---------------比较花钱 去你妈的哈哈哈哈

    例子 爸爸和妈妈方法       都让儿子继承

    # Father.py
    
    class Father(object):
    
        def __init__(self,money):
    
           self.money=money
    
        def play(self):
              print("这是paly哈哈哈哈哈哈哈哈")
    
        def func(self):
           print("这是func111111111111111111啦啦啦啦啦啦啦啦")
           
    # Mother.py 文件
    
    
    class Mother(object):
        """docstring for Father"""
        def __init__(self,faceValue):
    
          self.faceValue=faceValue
    
       def eat(self):
          print("我要吃哈哈哈哈eat")
    
       def func(self):
         print("这事了绿绿绿绿func")
    Child.py 文件
    
    # 多继承   这个Child  即继承了父类  和母类
    
    from Father import Father
    from Mother import Mother
    class Child(Father,Mother):
        def __init__(self,money,faceValue):
    
            
         Father.__init__(self,money)
         Mother.__init__(self,faceValue)
    # mian.py 执行文件
    from Child import Child
    
    def main ():
      c=Child(300,100)
      print(c.money,c.faceValue)
    
      c.piay()
      c.eat()
        # 注意:父类中方法名相同 默认调用的是在括号中排前面的父类中方法
      c.func()
    
    if __name__=="__main__":
    
      main()
    # a.py 文件
    class Aa (object):
        name="张三"
        age=0
        def __init__(self,lover,la):
            self.lover=lover
            self.la=la
        def aa(self):
            print("11")
            print(self.la)
    
    
        def bb(self):
            print("22")
            print(self.lover)
    # b.py文件
    class Ba(object):
    
    
        def cc(self):
            print("33")
    
        def dd(self):
            print("44")
    mian.py 执行文件
    
    from  a import Aa
    from b import  Ba
    # 方法一
    class Cc(Aa,Ba):
        def __init__(self,lover,la,idi):
    
           super(Cc,self).__init__(lover,la)
           self.idi = idi
        def gg(self):
            print(self.idi)
    
    f=Cc("66666","888888",7)
    
    f.aa()
    f.bb()
    f.gg()
    
    # 方法二
    class Cc(Aa,Ba):
        def __init__(self,lover,la,hh):
            self.__hh=hh
            Aa.__init__(self,lover,la)
            Ba.__init__(self)
        def jj(self):
            print(self.__hh)
    
    
    f=Cc("66666","888888",99999)
    f.aa()
    f.bb()
    f.jj()
    print(Cc.name)
  • 相关阅读:
    4-11 EurekaClient集成演示
    4-10 原始版服务调用演示
    4-9 Consumer内容准备
    4-8 Provider内容准备
    Swift:用UICollectionView整一个瀑布流
    Swift: 用Alamofire做http请求,用ObjectMapper解析JSON
    Swift: 用UserDefaults保存复杂对象
    BAT的真的适合创业团队吗?
    为什么要用GCD-Swift2.x
    Objective-C的泛型
  • 原文地址:https://www.cnblogs.com/Sup-to/p/10878967.html
Copyright © 2011-2022 走看看