python学习手册26 类代码编写基础

  1. 云栖社区>
  2. 博客>
  3. 正文

python学习手册26 类代码编写基础

天飞.h 2016-02-29 11:06:57 浏览267
展开阅读全文

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. #-*-coding:utf8-*-
  3. '''
  4. 类代码编写基础
  5.     类有三个主要不同
  6.         类产生多个实例对象
  7.         命名空间继承
  8.         运算符重载
  9.     类产生多个实例对象
  10.         类对象与实例对象
  11.             类对象提供默认行为,是实例工厂
  12.             实例对象是程序处理的实际对象,各自有独立的命名空间,便实例对象继承创建该实例的类的变量名。
  13.             类对象来自语句,实例对象来自调用。每调用一次类,产生一个新实例。执行class语句,就产生一个类对象。
  14.     类对象提供默认行为
  15.         python类的主要特点:
  16.             class语句创建类对象并将基赋值给变量名。
  17.             class内的赋值语句会创建类的属性。
  18.             类属性提供类的状态与行为。 类属性可由类创建的实例共享,类中的函数是方法,方法处理实例。
  19.     实例对象是具体的元素
  20.         实例对象是调用产生的。
  21.             调用类会产生新的实例对象,实例是类的具体元素。
  22.             实例对象继承类的属性并创建自己的作用域(命名空间)
  23.             方法内对self属性赋值会产生每个实例自己的属性。对self的属性赋值会创建或修改实例内的数据,而不是类的数据。
  24.     类通过继承进行定制
  25.         除了生成实例外,类也可以生成子类进行修改。
  26.         类可以继承其它类,这是类层次结构。在阶层比较低的类中可以覆盖继承的属性,从而实现定制。
  27.             类是层次结构,模块是平面结构。
  28.             实例从类继承,类从超类继承。
  29.         继承机制的核心:
  30.             超类列在类开关的括号中。
  31.             类从其超类中继承属性。
  32.             实例继承所有可读类的属性。
  33.             每个object.attribute都会独立开启新的搜索。
  34.             逻辑的修改是通过创建了类,而不是修改超类。
  35.     类是模块内的属性
  36.         python中的惯例,类应该使用一个大写字母开头,尽量不与模块名一致
  37.         模块反应了整个文件,而类是模块中的语句。

  38.     类可以截获python运算符
  39.         运算符重载:就是让类写成的对象可截获并响应内置类型上的运算:加法,切片,打印,点运算等。
  40.             以双下划线命名的方法(__XX__)是特殊的钩子。
  41.             当实例出现内置运算时,这类方法会自动调用。
  42.             类可以覆盖多数内置类型运算。
  43.             运算符覆盖方法没有默认值,也不需要。(如果类没有定义或继承运算符重载方法,就是说相应的运算在类实例中并不支持。如果没有__add__,+表达式就会引发异常)
  44.             运算符可让类与python的对象模型相集成。
  45.                 __init__是构造函数方法。
  46.     为什么要使用运算符重载
  47.         如果省略运算符重载,并且不从超类中继承,实例就不支持相应的运算;
  48.         只有在实现本质为数学对象时,才会用到许多运算符重载
  49.         传递用户自定义对象给预期的内置类型(如字典,列表)可用的运算符的函数。
  50.     类与字典的关系
  51.         类像字典一样存储数据,使用方法处理逻辑
  52. '''
  53. #创建类
  54. class FirstClass: #定义FirstClass类对象
  55.     def setdate(self,value): #定义类方法setdata 类内的赋值会成成为类的属性:FirstClass.setdata,方法每一个参数自动接收隐含的实例对象:调用的主体
  56.         self.data=value #self是实例,设定实例属性data
  57.     def display(self): #定义类方法dispaly FirstClass.display
  58.         print(self.data) #方法内容是打印实例属性data
  59. X=FirstClass() #产生2个实例X,Y
  60. Y=FirstClass()
  61. '''
  62.         FirstClass
  63.         (-setdata,-display)
  64.     X(-data) Y(-data)

  65. '''
  66. #继承是属性点号运算时发生的,而且只查找连接类的变量名。
  67. X.setdate('talen')
  68. Y.setdate(3.1415926)
  69. X.display()
  70. Y.display()
  71. X.data='new'
  72. X.display()
  73. #除在类中定义外,还可以直接对实例添加属性
  74. X.newvalue='create'
  75. print(X.newvalue)

  76. class secondclass(FirstClass):
  77.     def display(self): #secondclass的属性display覆盖超类的属性。这种动态称为重载。
  78.         print('current value = ' "%s" % self.data)#secondclass继承了FirstClass的setdata,所以这里的data实例属性还是可以用的。
  79. Z=secondclass()
  80. Z.setdate('new data')
  81. Z.display()
  82. '''
  83. Z(-data) secondclass(-display) FirstClass(-setdata,-display)
  84. Z.data Z.display Z.setdata
  85. '''

  86. class ThirdClass(secondclass): #超类secondclass继承
  87.     def __init__(self,value): #必须在类上附加value参数
  88.         self.data=value
  89.     def __add__(self,other): #这是一种运算符重载
  90.         return ThirdClass(self.data + other)
  91.     def __str__(self):
  92.         return '[ThirdClass: %s ]' % self.data
  93.     def mul(self,other):
  94.         self.data *= other
  95. A=ThirdClass('server') #__init__调用。必须在后面附加参数,否则报TypeError: __init__() takes exactly 2 arguments (1 given)
  96. A.display() #继承了secondclass超类中的display方法。
  97. print(A) #__str__调用
  98. B=A+'ok' #__add__调用,产生新的实例。B拥有ThirdClass所有属性
  99. B.display()
  100. print (B)
  101. A.mul(3)
  102. print(A)
  103. B.mul(4)
  104. print(B)
  105. #世界上最简单的类
  106. class rec:
  107.     pass
  108. rec.name='bob'
  109. rec.age=40
  110. print(rec.name)
  111. C=rec()
  112. D=rec()
  113. print(C.name)
  114. print(D.name)
  115. C.name='talen'
  116. print(C.name)
  117. print(D.name)
  118. #实例,类中所有赋值查看
  119. print(rec.__dict__.keys())
  120. print(C.__dict__.keys())
  121. print(D.__dict__.keys())
  122. #查看每个实例连接的类
  123. print(C.__class__)
  124. #查看超类
  125. print(ThirdClass.__bases__)

结果

点击(此处)折叠或打开

  1. /usr/bin/python2.7 /home/talen/PycharmProjects/untitled/t26.py
  2. talen
  3. 3.1415926
  4. new
  5. create
  6. current value = new data
  7. current value = server
  8. [ThirdClass: server ]
  9. current value = serverok
  10. [ThirdClass: serverok ]
  11. [ThirdClass: serverserverserver ]
  12. [ThirdClass: serverokserverokserverokserverok ]
  13. bob
  14. bob
  15. bob
  16. talen
  17. bob
  18. ['age', '__module__', '__doc__', 'name']
  19. ['name']
  20. []
  21. __main__.rec
  22. (class __main__.secondclass at 0x7ff6f5243600>,)

  23. Process finished with exit code 0


网友评论

登录后评论
0/500
评论
天飞.h
+ 关注