zoukankan      html  css  js  c++  java
  • Python面向对象入门

    这本书的第二章写的是抽象数据类型和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()的时候selfc的实例,所以调用cg()
    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(" After Sorting:")
    65. plist2.sort(key=None, reverse=True)
    66. for p in plist2:
    67. print(p.details())
    68. print("People created:", Person.num()," ")
    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(" ")
    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






    万事走心 精益求美


  • 相关阅读:
    事物
    性能优化
    eclipse中如何查看一个android模拟器的内部文件
    Android无线测试之—UiAutomator UiDevice API介绍二
    Android无线测试之—UiAutomator UiDevice API介绍一
    Linux最大打开文件描述符数
    Android无线测试之—UiAutmator运行命令介绍与快速调试
    Android无线测试之—UiAutomator编译与运行测试代码
    Android无线测试之—Genymotion配置过程中常见问题
    Android无线测试之—Genymotion模拟器环境搭建
  • 原文地址:https://www.cnblogs.com/kongchung/p/5803763.html
Copyright © 2011-2022 走看看