• python 类定义 继承


    0 前言

      系统:win7 64bit 

      IDE : python(x,y) 2.7.6.1

      IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32

    1 单继承

    1.1 定义一个时间类,带默认参数

    复制代码
    class mytime(object):
        def __init__(self,hour=21, 
                     minute=13, 
                     second=50):
            self.hour   = hour
            self.minute = minute
            self.second = second
            
        def __str__(self):
            return '__str__ hour:minute:second = %02d:%02d:%02d' 
                   %(self.hour,self.minute,self.second)
        
        def get_hour(self):
            return self.hour
        
        def get_minute(self):
            return self.minute
        
        def get_second(self):
            return self.second
    
        def print_time(self):
            print  'hour:minute:second = %02d:%02d:%02d' %(self.hour,self.minute,self.second)
      
    复制代码

    说明:  构造函数     __init__(self,hour=21, minute=13, second=50)  带默认参数的定义方式 ;

         用于输出的函数    __str__

               得到某属性值的方法    get_xxxx

               输出属性值的方法 print_time

    1.2 定义日期时间类,继承时间类的属性和方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class mydatetime(mytime):
        def __init__(self,year = 2016,mounth = 1,day = 1,
                          hour=21, minute=13,second=50):
            super(mydatetime,self).__init__(hour,minute,second)
            self.year = year
            self.mounth = mounth
            self.day = day
             
        def __str__(self):
            return '__str__ year--mounth--day = %02d--%02d--%02d' 
                   %(self.year,self.mounth,self.day)
         
        def __del__(self):
            """ __del__ mydatetime destroyed """
            print "__del__ mydatetime destroyed"
         
        def print_date(self):
            print  'year-mounth-day = %04d-%02d-%02d' 
            %(self.year,self.mounth,self.day)
    #        self.print_time() 

     说明:   mydatetime 继承 mytime 的属性值,这里mydatetime(子类),mytime(父类)

        构造函数     __init__(self,year = 2016,mounth = 1,day = 1, hour=21, minute=13,second=50)  带默认参数的定义方式 ,注意要通过 super初始化父类属性值;

        用于输出的函数    __str__

            输出属性值的方法 print_date

    1.3 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    if __name__ == '__main__':
     
        print " "
        print "--"*10," mytime t0:"  
        t0 = mytime()
        print t0
        t0.print_time()
        print t0.get_hour()
         
        print " "
        print "--"*10," mytime t1:"    
        t1 = mytime(hour=7,second=20)
        t1.print_time()
         
        print " "
        print "--"*10," mydatetime da:"  
        da = mydatetime(minute=40)
        print da
    #    da.print_date()
        da.print_time()
        del da

      输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> runfile('F:/Python/hysrc_py/untitled0_class.py', wdir=r'F:/Python/hysrc_py')
     
     
    --------------------  mytime t0:
    __str__ hour:minute:second = 21:13:50
    hour:minute:second = 21:13:50
    21
     
     
    --------------------  mytime t1:
    hour:minute:second = 07:13:20
     
     
    --------------------  mydatetime da:
    __str__ year--mounth--day = 2016--01--01
    hour:minute:second = 21:40:50
    __del__ mydatetime destroyed
    >>>

     2 多重继承

      2.1 定义父类  classA classX

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class classA(object):
     
        def __init__(self):
     
            print('init action in father class A')
             
             
    class classX(object):
     
        def __init__(self):
     
            print('init action in father class X')

       2.2 SubClassB 继承 classA

    1
    2
    3
    4
    5
    6
    7
    class SubClassB(classA):
     
        def __init__(self):
     
            print('init action in subclass B')
     
            super(SubClassB,self).__init__()

       2.3 SubClassC 继承 SubClassB

    1
    2
    3
    4
    5
    6
    7
    class SubClassC(SubClassB):
     
        def __init__(self):
     
            print('init action in subclass C')
     
            super(SubClassC,self).__init__()

       2.4 测试

      实例化一个SubClassC类

    1
    2
    3
    4
    5
    if __name__ == '__main__':
     
        print " "
        print "--"*10," SubClassC b:"     
        = SubClassC()

       由输出可知:多重继承时,子类会自动调用父类的构造函数

    1
    2
    3
    4
    --------------------  SubClassC b:
    init action in subclass C
    init action in subclass B
    init action in father class A

     3 多重继承

      3.1 定义两个基本类 classA 和 classX

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class classA(object):
     
        def __init__(self,a='classA'):
            self.a = a
            print('init action in father class A')
     
        def print_a(self):
            print self.a
             
    class classX(object):
     
        def __init__(self,x='classX'):
            self.x = x
            print('init action in father class X')
         
        def print_x(self):
            print self.x

     3.2 SubClassX 类继承自 classA 和 classX

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class SubClassX(classA,classX):
     
        def __init__(self,a='SubClassX:a',x='SubClassX:x'):
     
            print('init action in subclass X')
     
            super(SubClassX,self).__init__()
    #        classX.__init__(self)
            self.a = a
            self.x = x
     
        def print_SubX(self):
            self.print_a()
            self.print_x()

     3.3 实例化一个 SubClassX 类

    1
    2
    3
    4
    5
    6
    if __name__ == '__main__':
      
        print " "
        print "--"*10," SubClassX x:"   
        sx = SubClassX()
        sx.print_SubX()

     3.4  由输出可知 : SubClassX 继承了 classA 和 classX 的方法和属性,但不知为何只调用了 classA的初始化函数?

    1
    2
    3
    4
    5
    --------------------  SubClassX x:
    init action in subclass X
    init action in father class A
    SubClassX:a
    SubClassX:x

     3.5 分析:其实在 3.4 的输出可知,SubClassX只调用了classA的初始化,则classX的属性是不会自动初始化的,如classX的属性值x,之所以能够输出 "SubClassX:x" ,是由于在 3.2的定义中,手动初试化了 属性值。self.a = a self.x = x

    如下例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class SubClassX(classA,classX):
     
        def __init__(self,a='SubClassX:a',x='SubClassX:x'):
     
            print('init action in subclass X')
     
            super(SubClassX,self).__init__(a)
    #        classX.__init__(self)
    #        self.x = x
     
        def print_SubX(self):
            self.print_a()
            self.print_x()

     实例化一个 SubClassX 类:

    1
    2
    3
    4
    5
    6
    if __name__ == '__main__':
      
        print " "
        print "--"*10," SubClassX x:"   
        sx = SubClassX()
        sx.print_SubX()

    输出报错: 由于定义SubClassX类时,使用 super 初始化父类,只会初试化 classA,即第一个类。而classX排在了classA之后,不会自动初始化。所以在实例化类调用方法时,即 sx.print_SubX() 。由于没有属性 'x' 而报错。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    --------------------  SubClassX x:
    init action in subclass X
    init action in father class A
    SubClassX:a
    Traceback (most recent call last):
      File "<stdin>", line 1in <module>
      File "C:Python27libsite-packagesspyderlibwidgetsexternalshellsitecustomize.py", line 540in runfile
        execfile(filename, namespace)
      File "F:/Python/hysrc_py/untitled0_class.py", line 111in <module>
        sx.print_SubX()
      File "F:/Python/hysrc_py/untitled0_class.py", line 57in print_SubX
        self.print_x()
      File "F:/Python/hysrc_py/untitled0_class.py", line 24in print_x
        print self.x
    AttributeError: 'SubClassX' object has no attribute 'x'
    >>>

     错误提示:属性错误:'SubClassX' 对象 没有属性 'x'

    ~~~~~~~~~~~~~~~~ 博文多为个人学习中的笔记,不保证完全正确; 参考摘录了诸多书籍,文档,仅用于学习交流 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 相关阅读:
    线程池进程池
    设计原则与设计模式
    腾讯阿里第三方接入
    计划任务
    系统服务
    Python Faker模块
    Python openpyxl模块
    Python-docx模块
    进程管理
    磁盘管理
  • 原文地址:https://www.cnblogs.com/AmilyWilly/p/8469997.html
Copyright © 2020-2023  润新知