Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126502
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-13 10:26
个人简介

- 毅力与勇气是事业的双飞翼; - 在尝试中成长,在失败中奋起。 - 概览 -> 细读 -> 概览 - 书不在多,在于精。

文章分类

全部博文(83)

文章存档

2016年(2)

2015年(6)

2014年(75)

我的朋友

分类: LINUX

2014-05-30 14:50:59


点击(此处)折叠或打开

  1. # coding: utf-8

  2. u'''类的继承、重载

  3. 类的继承:
  4. 1.新类可以继承父类的公有属性和公有方法。在类的内部方法中调用变量,需以"self.变量名"的方式来调用。self指类本身的属性、方法等。
  5. 2.类的私有属性命名,以'__'开头,如__var;类的私有属性不能在类的外部被使用或者访问,当然也不能修改,若要修改类的私有属性或者获取其值,可以通过使用类提供的方法来完成。在类的内部的方法中使用类的私有属性,必须以“self.私有属性名”的方式调用,如self.__var。
  6. 3.类的私有方法命名,也以'__'开头,如__show()。类的私有方法只能在类的内部进行调用,也必须以“self.私有方法名”的形式进行调用。
  7. 4.类的专有方法,以两条下划线开始并且以两条下划线结束,如__init__(),在类的实例化时将调用__init__()方法,常用__init__()方法为对象的属性进行初始化赋初值。
  8. 4.类中定义函数,必须含有第一个参数self,如def show(self)。
  9. 5.类实例化成对象时,所需参数个数,见类的初始化函数__init__()所定义的参数个数。若继承的子类中没有定义初始化函数__init__(),则其所需参数个数与父类中的__init()参数个数一致。
  10. 6.使用多重继承,需要注意父类名字的顺序。如果父类中有相同名字的方法名,而在子类中使用时未指定父类名,则python解释器将从左至右搜索,调用最先遇到的父类的方法。
  11. 7.如果父类定义了__init__方法,则子类必须显示地调用父类的__init__方法(若父类没有定义__init__,则不用),如果子类需要扩展父类的行为,可以添加__init__方法的参数。
  12. 8.__init__()方法,主要用于初始化类中的属性,以将属性供给类中的方法使用。

  13. 类的重载:(重载也是继承,通过继承的子类,其父类的方法不一定能满足类的需要,新类实际上只是修改了部分功能,为了避免命名函数的麻烦,进行方法重载。)
  14. 1.重载允许通过继承而创建的类重新定义父类的方法。不仅可以重载方法,而且还可以重载运算符,以适用自创建的类。
  15. 2.函数的重载是指多个函数的名称以及返回值类型均相同,仅参数类型或参数个数不同。函数重载大大提高了代码重用率和程序员开发效率。
  16. 3.python中函数参数变量是没有类型的,当你调用传值的时候才知道它到底是什么类型的变量。故对参数类型不同的函数根本无需考虑重载。
  17. 4.重载的一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载. 如果两个函数的功能不同,那么不应当使用重载,而应当使用一个名字不同的函数。
  18. '''

  19. # 1.类的继承:
  20. class book: # 定义book类
  21.     """docstring for ClassName"""
  22.     __author = '' # 定义类的私有属性
  23.     __name = ''
  24.     __page = 0
  25.     price = 0 # 类的公有属性
  26.     __press = ''

  27.     def __check(self, item): # 定义__check私有方法
  28.         if item == '':
  29.             return 0
  30.         else:
  31.             return 1

  32.     def show(self):
  33.         if self.__check(self.__author):
  34.             print self.__author
  35.         else:
  36.             print 'no value'

  37.         if self.__check(self.__name):
  38.             print self.__name
  39.         else:
  40.             print 'NO VALUE'

  41.     def setname(self, name):
  42.         self.__name = name
  43.     
  44.     def __init__(self, author, name): # 使用__init__方法,为类的__author及__name赋初值。
  45.         self.__author = author
  46.         self.__name = name

  47. class student(book): # 继承book类,来创建student类。新类可以继承父类的公有属性和公有方法。
  48.     """docstring for ClassName"""
  49.     __class = ''
  50.     __grade = 0
  51.     __sname = ''

  52.     def showinfo(self): # 定义一个新的showinfo方法
  53.         self.show() # 此处仅调用book类中的show方法。也可以写成book.show(self)
  54.         #book.show(self) # 此处仅调用book类中的show方法


  55. def main():
  56.     a = student('Jack', 'Big Book') # student类继承了book类的__init__方法且student类没有定义__init__方法,故所需参数见父类的__init__需要3个参数(包括默认的不显示的self参数)。
  57.     a.showinfo() # 调用student类中的showinfo方法
  58.     print '1,========='
  59.     a.show()         # 调用book类中的show方法
  60.     #a.__class # 错误!类的私有属性不能在类的外部被调用。同样,在类的外部调用book.__check()也是错误的。

  61.     a = student('','')
  62.     a.showinfo()
  63.     print '2,========='
  64.     a.show()

  65. if __name__ == '__main__':
  66.     main()



  67. # 2.类的多重继承:

  68. class A:
  69.     namea = 'A'
  70.     __num = 1

  71.     def show(self):
  72.         print self.namea #在类的内部调用属性都以 "self.属性名"方式来调用。
  73.         print self.__num

  74.     def setnum(self, num):
  75.         self.__num = num

  76. class B:
  77.     nameb = 'B'
  78.     __num = 2

  79.     def show(self):
  80.         print self.nameb
  81.         print self.__num

  82.     def setname(self, name):
  83.         self.nameb = name # 类中的self指类本身中的属性和方法等。

  84. class C(A, B):
  85.     def showall(self):
  86.         print self.namea
  87.         print self.nameb
  88.         #print self.__num #错误!__num为私有属性,不可继承!
  89.     show = B.show #指定show方法为B类的show方法。AB类中都有同名show方法,若不指定,则解释器从左至右搜索,去最先搜索到的同名show方法。

  90. c = C() # 实例化C类成c对象
  91. c.showall()

  92. c.show() # 此处调用的A的show(),因为没有指定

  93. c.setname(3) #
  94. c.show()


  95. # 3.类的重载:

  96. # __init__方法的重载
  97. class human:
  98.     __age = 0
  99.     __sex = ''
  100.     __height = 0
  101.     __weight = 0
  102.     name = ''

  103.     def __init__(self, age ,sex, height, weight): # 重载__init__方法
  104.         self.__age = age
  105.         self.__sex = sex
  106.         self.__height = height
  107.         self.__weight = weight

  108.     def setname(self, name):
  109.         self.name = name

  110.     def show(self):
  111.         print self.name # 类中的公有属性也用self调用。
  112.         print self.__age
  113.         print self.__sex
  114.         print self.__height
  115.         print self.__weight

  116. class student(human):
  117.     __classes = 0
  118.     __grade = 0
  119.     __num = 0

  120.     def __init__(self, classes, grade, num, age, sex, height, weight): # 重载__init__方法
  121.         self.__classes = classes
  122.         self.__grade = grade
  123.         self.__num = num
  124.         human.__init__(self, age, sex, height, weight) # 调用human类的__init__方法初始化human类的属性.

  125.     def show(self): # 重载show方法
  126.         human.show(self) # 调用human类的show方法
  127.         print self.__classes
  128.         print self.__grade
  129.         print self.__num

  130. a = student(12,3,20140901,25,'male',170,55) # 实例化生成a对象,参数个数与student类的__init__方法的参数个数一致。
  131. a.setname('Tom') # 调用父类human中的setname方法
  132. a.show() # 调用子类student中的show方法,即重载后的show方法。

阅读(2840) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~