Python面向对象进阶

心已赠人 2022-04-25 08:16 316阅读 0赞

1.@property装饰器

类似java里的get, set方法。
复杂版:

  1. class Student(object):
  2. def get_score(self):
  3. return self._score
  4. def set_score(self, value):
  5. if not isinstance(value, int):
  6. raise ValueError('score must be an integer!')
  7. if value < 0 or value > 100:
  8. raise ValueError('score must between 0 ~ 100!')
  9. self._score = value

使用@property装饰器版:

  1. class Student(object):
  2. @property
  3. def score(self):
  4. return self._score
  5. @score.setter
  6. def score(self, value):
  7. if not isinstance(value, int):
  8. raise ValueError('score must be an integer!')
  9. if value < 0 or value > 100:
  10. raise ValueError('score must between 0 ~ 100!')
  11. self._score = value

2.继承

  1. class Person(object):
  2. def __init__(self, name, age):
  3. self._name = name
  4. self._age = age
  5. @property
  6. def name(self):
  7. return self._name
  8. @property
  9. def age(self):
  10. return self._age
  11. @age.setter
  12. def age(self, age):
  13. self._age = age
  14. def play(self):
  15. print('%s正在愉快的玩耍' % self._name)
  16. def watch_movies(self):
  17. if self._age >= 18:
  18. print('%s正在观看《一拳超人》.' % self._name)
  19. else:
  20. print('%s只能观看《喜洋洋》.' % self._name)
  21. class Student(Person):
  22. def __init__(self, name, age, grade):
  23. super().__init__(name, age)
  24. self._grade = grade
  25. @property
  26. def grade(self):
  27. return self._grade
  28. @grade.setter
  29. def grade(self, grade):
  30. self._grade = grade
  31. def study(self, course):
  32. print('%s的%s正在学习%s.' % (self._grade, self._name, course))
  33. def main():
  34. stu = Student('郭德纲', 42, '初三')
  35. stu.study('数学')
  36. stu.watch_movies()
  37. if __name__ == '__main__':
  38. main()

3.重载

  1. from abc import ABCMeta, abstractclassmethod
  2. class Employee(object, metaclass=ABCMeta):
  3. def __init__(self, name):
  4. self._name = name
  5. @property
  6. def name(self):
  7. return self._name
  8. @abstractclassmethod
  9. def get_salary(self):
  10. pass
  11. class Manager(Employee):
  12. # 想一想: 如果不定义构造方法会怎么样
  13. def __init__(self, name):
  14. # 想一想: 如果不调用父类构造器会怎么样
  15. super().__init__(name)
  16. def get_salary(self):
  17. return 15000.0
  18. class Programmer(Employee):
  19. def __init__(self, name, working_hour):
  20. super().__init__(name)
  21. self._working_hour = working_hour
  22. @property
  23. def working_hour(self):
  24. return self._working_hour
  25. @working_hour.setter
  26. def working_hour(self, working_hour):
  27. self._working_hour = working_hour if working_hour > 0 else 0
  28. def get_salary(self):
  29. return 150.0 * self._working_hour
  30. class Salesman(Employee):
  31. def __init__(self, name, sales):
  32. super().__init__(name)
  33. self._sales = sales
  34. @property
  35. def sales(self):
  36. return self._sales
  37. @sales.setter
  38. def sales(self):
  39. self._sales = sales if sales > 0 else 0
  40. def get_salary(self):
  41. return 1200.0 + self._sales * 0.05
  42. def main():
  43. emps = [
  44. Manager('刘备'), Programmer('诸葛亮', 150), Salesman('荀彧', 10000)
  45. ]
  46. for emp in emps:
  47. print('%s本月工资为: ¥%s元' % (emp.name, emp.get_salary()))
  48. if __name__ == '__main__':
  49. main()

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读