这本书的第二章写的是抽象数据类型和Python类
以前从没想过认真的去写Python但是既然用Python去学Spark了

现在就要认真对待Python进行数据处理的基础了
整体上看除了更随意的感觉之外和java或者cpp的感觉差不多

类可以定义在程序的任何地方,一般都是写在最外层

类的实例使用__init__(self)函数初始化
_num在属性前面加下划线就是默认的私有变量
__method这样的属性类外无法访问
__add__, __init__, __st__,等是特殊的意义的函数

属性不需要定义,直接使用

实例也是独立的数据体可以传递到其他的函数中
也可以作为其他实例的属性值
这可以构造成复杂的对象结构

类中三种方法
实例方法:智能通过实例调用,方法对象例如p.m(a,b)也是一种对象,可以写成q=p.m然后用q(a,b)去执行
静态方法:@staticmethod,函数里面没有self参数,可以用类名字调用,可以用self调用,也可以实例调用
类方法:@classmethod,习惯使用cls作为参数,可以访问类属性,无法访问实例属性,关注从类中调用而不是实例调用
可以认为类方法进行的是类内部的数据的转换,实例方法进行的数据的输出,静态方法可以做一些独立的验证


动态约束:
  1. class B:
  2. def f(self):
  3. self.g()
  4. def g(self):
  5. print("B.g Called.")
  6. class C(B):
  7. def g(self):
  8. print("C.g Called.")
  9. b = B()
  10. c = C()
  11. b.f()
  12. c.f()#调用f()的时候self是c的实例,所以调用c的g()
  13. '''
  14. B.g Called.
  15. C.g Called.
  16. '''
下面是一个完整的面向对象的例子:
  1. #导入可以获取日期的包
  2. import datetime
  3. #继承现有的错误类型,创建两个空的错误类
  4. class PersonTypeError(TypeError):
  5. pass
  6. class PersonValueError(ValueError):
  7. pass
  8. #构造基类Person
  9. class Person:
  10. _num = 0
  11. @staticmethod
  12. def _hello(str):
  13. return print("我是静态方法"+ str)
  14. def __init__(self,name ,sex, birthday, ident):
  15. if not(isinstance(name, str)) and sex in ("男","女"):#name 不是字符串或者性别不是这两个的时候报错
  16. raise PersonTypeError(name ,sex)
  17. try:
  18. birth = datetime.date(*birthday)
  19. except:
  20. raise PersonValueError("Wrong date:", birthday)
  21. self._name = name#表示约定的私有属性
  22. self._sex = sex
  23. self._birthday = birthday
  24. self._id = ident
  25. Person._num += 1#每调用一次初始化,这个值都增加1,表示计数
  26. def id(self): #定义简单的方法取出内部的属性值,相当于简单的getter方法
  27. return self._id
  28. def name(self):
  29. return self._name
  30. def sex(self):
  31. return self._sex
  32. def birthday(self):
  33. return self._birthday
  34. def age(self):
  35. return (datetime.date.today().year - self._birthday.year)
  36. def set_name(self,name): #定义简单的方法:设置属性值,相当于简单的setter方法
  37. if not isinstance(name, str):
  38. raise PersonValueError("set_name", name)
  39. self._name = name
  40. def __lt__(self,another): #小于运算的方法要求另外的一个参数也是Person的实例
  41. if not isinstance(another, Person):
  42. raise PersonTypeError(another)
  43. return self._id < another._id
  44. @classmethod
  45. def num(cls): #获取计数
  46. return Person._num
  47. def __str__(self):
  48. return " ".join((self._id,self._name,self._sex,str(self._birthday)))
  49. def details(self):
  50. self._hello("self调用")
  51. return ", ".join(("编号: " + self._id,
  52. "姓名: " + self._name,
  53. "性别: " + self._sex,
  54. "出生日期: " + str(self._birthday)))
  55. #join参数要求可迭代的元组
  56. #手动实例化
  57. p1 = Person("jason","男",(1992,8,12),"201422501030")
  58. p2 = Person("peggy","女",(1994,10,14),"201422501032")
  59. p3 = Person("shown","男",(1993,8,13),"201422501031")
  60. p4 = Person("thea","女",(1995,11,15),"201422501033")
  61. plist2 = [p1,p2,p3,p4]
  62. for p in plist2:
  63. print(p)
  64. print("\nAfter Sorting:")
  65. plist2.sort(key=None, reverse=True)
  66. for p in plist2:
  67. print(p.details())
  68. print("People created:", Person.num(),"\n")
  69. Person._hello("Persop调用")
  70. p1._hello("实例调用")
  71. #继承创建第一个类:学生类
  72. class Student(Person):
  73. _id_num = 0
  74. @classmethod
  75. def _id_gen(cls):
  76. cls._id_num+=1
  77. year = datetime.date.today().year
  78. return "1{:04}{:05}".format(year, cls._id_num)#构造学生学号,1+年份+编号
  79. def __init__(self,name,sex,birthday,department):#重写初始化方法,
  80. Person.__init__(self, name, sex, birthday, Student._id_gen())#指明了父类,要self参数
  81. self._department = department
  82. self._enroll_date = datetime.date.today()
  83. self._courses = {} #空字典
  84. def set_course(self,course_name):
  85. self._courses[course_name] = None #给key赋值,value为空
  86. def set_score(self,course_name,score):
  87. if course_name not in self._courses:
  88. raise PersonValueError("No this course selected:", course_name)
  89. self._courses[course_name] =score #给value赋值
  90. def scores(self):
  91. return [(cname, self._courses[cname]) for cname in self._courses]
  92. def details(self):
  93. return ", ".join((Person.details(self),
  94. "入学日期: " + str(self._enroll_date),
  95. "院系: " + self._department,
  96. "课程记录: " + str(self.scores())))
  97. s1 = Student("Charles","男",(1992,8,12),"Automation Dept")
  98. s2 = Student("jason","男",(1991,9,18),"Cybernetics Dept")
  99. print(s1)
  100. s1.set_course("Python")#选课
  101. s1.set_score("Python", 90)#给分
  102. s1.set_course("Spark")
  103. s1.set_score("Spark",100)
  104. print(s1.scores())
  105. print(s1.details())
  106. print(s2.details())
  107. print("\n")
  108. #继承创建第二个类:员工类
  109. class Staff(Person):
  110. _id_num = 0
  111. @classmethod
  112. def _id_gen(cls,birthday):
  113. cls._id_num +=1
  114. birth_year = datetime.date(*birthday).year
  115. return "0{:04}{:05}".format(birth_year, cls._id_num)
  116. def __init__(self,name,sex,birthday,entry_date=None):
  117. super().__init__(name, sex, birthday, Staff._id_gen(birthday))
  118. if entry_date:
  119. try:
  120. self._entry_date = datetime.date(*entry_date)
  121. except:
  122. raise PersonValueError("Wrong date:", entry_date)
  123. else:
  124. self._entry_date = datetime.date.today()
  125. self._salary = 1720
  126. self._depertment = "未定"
  127. self._position = "未定"
  128. def set_salary(self,amount):
  129. if not type(amount) is int:
  130. raise TypeError
  131. self._salary = amount
  132. def set_posotion(self,position):
  133. self._position = position
  134. def set_department(self,department):
  135. self._depertment = department
  136. def details(self):
  137. return ", ".join((super().details(),
  138. "入职日期: " + str(self._entry_date),
  139. "院系: "+ self._depertment,
  140. "职位: " + self._position,
  141. "工资: " + str(self._salary)))
  142. t1 = Staff("natasha","女",(1991,9,18))
  143. t2 = Staff("heater","女",(1992,10,19))
  144. print(t1)
  145. print(t2)
  146. t1.set_department("数学")
  147. t1.set_posotion("讲师")
  148. t1.set_salary(8888)
  149. print(t1.details())
  150. print(t2.details())
程序的执行结果:
  1. 201422501030 jason 男 (1992, 8, 12)
  2. 201422501032 peggy 女 (1994, 10, 14)
  3. 201422501031 shown 男 (1993, 8, 13)
  4. 201422501033 thea 女 (1995, 11, 15)
  5. After Sorting:
  6. 我是静态方法self调用
  7. 编号: 201422501033, 姓名: thea, 性别: 女, 出生日期: (1995, 11, 15)
  8. 我是静态方法self调用
  9. 编号: 201422501032, 姓名: peggy, 性别: 女, 出生日期: (1994, 10, 14)
  10. 我是静态方法self调用
  11. 编号: 201422501031, 姓名: shown, 性别: 男, 出生日期: (1993, 8, 13)
  12. 我是静态方法self调用
  13. 编号: 201422501030, 姓名: jason, 性别: 男, 出生日期: (1992, 8, 12)
  14. People created: 4
  15. 我是静态方法Persop调用
  16. 我是静态方法实例调用
  17. 1201600001 Charles 男 (1992, 8, 12)
  18. [('Python', 90), ('Spark', 100)]
  19. 我是静态方法self调用
  20. 编号: 1201600001, 姓名: Charles, 性别: 男, 出生日期: (1992, 8, 12), 入学日期: 2016-08-24, 院系: Automation Dept, 课程记录: [('Python', 90), ('Spark', 100)]
  21. 我是静态方法self调用
  22. 编号: 1201600002, 姓名: jason, 性别: 男, 出生日期: (1991, 9, 18), 入学日期: 2016-08-24, 院系: Cybernetics Dept, 课程记录: []
  23. 0199100001 natasha 女 (1991, 9, 18)
  24. 0199200002 heater 女 (1992, 10, 19)
  25. 我是静态方法self调用
  26. 编号: 0199100001, 姓名: natasha, 性别: 女, 出生日期: (1991, 9, 18), 入职日期: 2016-08-24, 院系: 数学, 职位: 讲师, 工资: 8888
  27. 我是静态方法self调用
  28. 编号: 0199200002, 姓名: heater, 性别: 女, 出生日期: (1992, 10, 19), 入职日期: 2016-08-24, 院系: 未定, 职位: 未定, 工资: 1720

Python面向对象入门的更多相关文章

  1. python面向对象入门(1):从代码复用开始

    本文从代码复用的角度一步一步演示如何从python普通代码进化到面向对象,并通过代码去解释一些面向对象的理论.所以,本文前面的内容都是非面向对象的语法实现方式,只有在最结尾才给出了面向对象的简单语法介 ...

  2. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  3. Python基础入门教程,Python学习路线图

    给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  4. Python怎么样入门?Python基础入门教程

    给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  5. Python快速入门

    Python快速入门 一.基础概要 命名:h.py Linux命令行运行:python h.py 注释.数字.字符串: 基本类型只有数字与字符串 #python注释是这样写的 ''' 当然也可以这样 ...

  6. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  7. python面向对象重新梳理

    关于本篇博文: 面向对象中所有的内容的重新梳理,其实面向对象的知识早在一个多月前就学习过并整理过,但是发现还是有所欠缺,故在此以极其简介的语言风格重新梳理一遍 面向对象详细介绍:http://www. ...

  8. Java面向对象入门

    Java面向对象入门 一.Java面向对象的基本组成 Java类及类的成员:属性.方法.构造器:代码块.内部类 面向对象三大特征:封装.继承.多态(抽象) 关键字:this.super.static. ...

  9. python从入门到大神---1、初始化实例、类属性、方法

    python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...

随机推荐

  1. nginx 优化

    隐藏nginx版本号:在http标签内写server_tokens off; 隐藏apache版本号:ServerTokens Prod ServerSignature Off 更改nginx默认的用 ...

  2. git使用记录(新手入门)

    最近参与了公司的项目开发,最后要用git来把代码添加到远程库,但是没怎么接触过git,记录一下使用的流程 首先,当然是先下载git,这个略过不提,下载完之后,在你想要保存代码的目录下,用git ini ...

  3. 记一个由MemCached引发的性能问题

    最近有个项目用loadrunner做了压力测试,发现并发量还不到200服务器就支撑不住了.boss那边紧急开会,说此项目最近3个月内将有100家中大型公司用于校园招聘工作,如果这个问题不解决公司有可能 ...

  4. 【python cookbook】【字符串与文本】14.字符串连接及合并

    问题:将许多小字符串合并成一个大的字符串 解决方案: 1.针对少数量的字符串:+ 2.针对大量的字符串对象的连接,更高效的方法:join() 3.更加复杂的字符串:format() >>& ...

  5. 【python cookbook】【字符串与文本】6.以不区分大小写的方式对文本做查找和替换

    问题:以不区分大小写的方式对文本做查找和替换 解决方法:使用re模块,并对各种操作都添加上re.IGNORECASE标记 text='UPPER PYTHON,lower python,Mixed P ...

  6. JS和CSS的多浏览器兼容(2)

    2.Css的浏览器兼容性 方法一,根据不同的浏览器加载不同的css file <!DOCTYPE html>  <html> <head> <title> ...

  7. rotate array 旋转数组

    class Solution {public: void rotate(vector<int>& nums, int k) { int n=nums.size(); int i=0 ...

  8. JavaEE基础(七)

    1.面向对象(构造方法Constructor概述和格式) A:构造方法概述和作用 给对象的数据(属性)进行初始化 B:构造方法格式特点 a:方法名与类名相同(大小也要与类名一致) b:没有返回值类型, ...

  9. js实现通用的微信分享组件示例

    一.可定义的信息 1.分享时显示的LOGO:2.分享LOGO的宽度:3.分享LOGO的高度:4.分享出去显示的标题(默认调用网页标题):5.分享出去显示的描述(默认调用网页标题):6.分享链接(默认为 ...

  10. 修改ecshop让订单详情里将会员地址详情全部显示

    $sql = "SELECT concat(IFNULL(c.region_name, ''), '  ', IFNULL(p.region_name, ''), " . &quo ...