当前位置: 首页 > news >正文

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  "\n"
     print  "--" * 10 , " mytime t0:"  
     t0  =  mytime()
     print  t0
     t0.print_time()
     print  t0.get_hour()
     
     print  "\n"
     print  "--" * 10 , " mytime t1:"    
     t1  =  mytime(hour = 7 ,second = 20 )
     t1.print_time()
     
     print  "\n"
     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  "\n"
     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  "\n"
     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  "\n"
     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  1 in  <module>
   File  "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py" , line  540 in  runfile
     execfile (filename, namespace)
   File  "F:/Python/hysrc_py/untitled0_class.py" , line  111 in  <module>
     sx.print_SubX()
   File  "F:/Python/hysrc_py/untitled0_class.py" , line  57 in  print_SubX
     self .print_x()
   File  "F:/Python/hysrc_py/untitled0_class.py" , line  24 in  print_x
     print  self .x
AttributeError:  'SubClassX'  object  has no attribute  'x'
>>>

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

~~~~~~~~~~~~~~~~ 博文多为个人学习中的笔记,不保证完全正确; 参考摘录了诸多书籍,文档,仅用于学习交流 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

转载于:https://www.cnblogs.com/AmilyWilly/p/8469997.html

相关文章:

  • ubuntu Server 设置主机静态 ip地址
  • jq实现jsonp
  • Java GC -- G1
  • 决策树-过程
  • PHP框架中最喜欢的WindFramework
  • jqMobi 更小更快的移动框架
  • 二元决策图(Binary decision diagram)
  • 高级 IO
  • 如何优雅的设计 Java 异常
  • 给Jquery添加alert,prompt方法,类似系统的Alert,Prompt,可以响应键盘,支持拖动...
  • SmartDeblur-图片模糊处理器
  • MySql之limit使用
  • Android适配底部返回键等虚拟键盘的完美解决方案
  • Java虚拟机编译机制:更改常量部分
  • INCRBY key increment
  • Laravel 菜鸟晋级之路
  • mysql 数据库四种事务隔离级别
  • nodejs实现webservice问题总结
  • opencv python Meanshift 和 Camshift
  • PHP的Ev教程三(Periodic watcher)
  • Vue小说阅读器(仿追书神器)
  • Webpack 4 学习01(基础配置)
  • Xmanager 远程桌面 CentOS 7
  • 给第三方使用接口的 URL 签名实现
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微信开源mars源码分析1—上层samples分析
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 云大使推广中的常见热门问题
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​香农与信息论三大定律
  • (13)Hive调优——动态分区导致的小文件问题
  • (2)MFC+openGL单文档框架glFrame
  • (zhuan) 一些RL的文献(及笔记)
  • (二)Linux——Linux常用指令
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (生成器)yield与(迭代器)generator
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)插入排序
  • (原)Matlab的svmtrain和svmclassify
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net core 连接数据库,通过数据库生成Modell
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET MVC之AOP
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • /etc/sudoer文件配置简析
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ linux ] linux 命令英文全称及解释
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [20150321]索引空块的问题.txt
  • [android] 切换界面的通用处理