第三周python面向对象学习总结
2018-03-17 16:43
453 查看
这周主要学习了面向对象,了解面向对象的用法,何为对象呢,生活中一切皆为对象,编程就是将生活中要解决的事用程序语言表达出来,如果会灵活运用面向对象,一切将会变得非常容易。我把我学到的做以分享。
2,以类为核心的、面向对象的编程,提高了代码的模块化程度,便于大规模协作的开展;
3,现如今的高级语言,基本都是面向对象的;
4,面向对象的三大特性:封装、继承、多态;
5,继承 - 从已经有的类创建新类的过程
6,提供继承信息的称为父类(超类/基类)
7,得到继承信息的称为子类(派生类/衍生类)
8,通过继承我们可以将子类中的重复代码抽取到父类中
9,子类通过继承并复用这些代码来减少重复代码的编写
10, 将来如果要维护子类的公共代码只需要在父类中进行操作即可
可以通过具体的代码了解
了解property包装器
1,使用property装饰器将方法转为属性
关键字参数 - 字典 - 根据参数名来决定如何执行
可变参数 - 元组
命名关键字参数
decorator - 装饰器 / 包装器
通过一个定义一个矩形的对象求它的周长和面积具体了解
了解类方法和静态方法
1,通常在类中定义一个方法时,系统都会默认带上一个self参数,这样的方法称之为实例方法;
2,实例方法也就是,只有通过创建类的实例才能访问的方法;
3,静态方法以@staticmethod装饰器进行装饰,它相当于一个写在类的作用域中的普通方法;
4,类方法以@classmethod装饰器进行装饰,它有一个系统默认参数cls,代表的是当前类,我 们可以通过这个cls()去创建一个类的实例;
已知三条边,判定能否构成三角形,然后求周长和面积
练习1计算员工工资结算
练习2 五子棋游戏
了解面向对象
1,面向过程的编程是以函数为核心的,而面向对象的编程是以类为核心的,一切功能的实现,都是通过创建一个司职该功能的类的实例,进而调用其方法去予以实现的;2,以类为核心的、面向对象的编程,提高了代码的模块化程度,便于大规模协作的开展;
3,现如今的高级语言,基本都是面向对象的;
4,面向对象的三大特性:封装、继承、多态;
5,继承 - 从已经有的类创建新类的过程
6,提供继承信息的称为父类(超类/基类)
7,得到继承信息的称为子类(派生类/衍生类)
8,通过继承我们可以将子类中的重复代码抽取到父类中
9,子类通过继承并复用这些代码来减少重复代码的编写
10, 将来如果要维护子类的公共代码只需要在父类中进行操作即可
可以通过具体的代码了解
class Person(object): def __init__(self, name, age): self._name = name self._age = age def watch_av(self): if self._age >= 18: print('%s正在看片.' % self._name) else: print('%s只能看《熊出没》.' % self._name) class Student(Person): def __init__(self, name, age, grade): super().__init__(name, age) self._grade = grade def study(self, course): print('%s的%s正在学习%s.' % (self._grade, self._name, course)) class Teacher(Person): def __init__(self, name, age, title): super().__init__(name, age) self._title = title def teach(self, course): print('%s%s正在讲%s.' % (self._name, self._title, course)) def main(): stu = Student('二狗', 15, '初三') stu.study('英语') stu.watch_av() t = Teacher('老万', 45, '叫兽') t.teach('爬虫') t.watch_av() if __name__ == '__main__': main()
了解property包装器
1,使用property装饰器将方法转为属性
关键字参数 - 字典 - 根据参数名来决定如何执行
可变参数 - 元组
命名关键字参数
decorator - 装饰器 / 包装器
通过一个定义一个矩形的对象求它的周长和面积具体了解
class Rect(object): def __init__(self, width=0, height=0): self._width = width self._height = height @property def width(self): return self._width @width.setter def width(self, width): self._width = width if width > 0 else 0 @property def height(self): return self._height @height.setter def height(self, height): self._height = height if height > 0 else 0 @property def area(self): return self._width * self._height @property def perimeter(self): return (self._width + self._height) * 2 def main(): rect = Rect(3, 5) print(rect.area) print(rect.perimeter) rect.width = 20 rect.height = 3.5 print(rect.area) print(rect.perimeter) if __name__ == '__main__': main()
了解类方法和静态方法
1,通常在类中定义一个方法时,系统都会默认带上一个self参数,这样的方法称之为实例方法;
2,实例方法也就是,只有通过创建类的实例才能访问的方法;
3,静态方法以@staticmethod装饰器进行装饰,它相当于一个写在类的作用域中的普通方法;
4,类方法以@classmethod装饰器进行装饰,它有一个系统默认参数cls,代表的是当前类,我 们可以通过这个cls()去创建一个类的实例;
已知三条边,判定能否构成三角形,然后求周长和面积
class Triangle(object): def __init__(self, a, b, c): self._a = a self._b = b self._c = c # @classmethod # def is_valid(cls, a, b, c): @staticmethod def is_valid(a, b, c): # print(cls) # print(type(cls)) return a + b > c and b + c > a and a + c > b def perimeter(self): return self._a + self._b + self._c def area(self): half = self.perimeter() / 2 return sqrt(half * (half - self._a) * (half - self._b) * (half - self._c)) def main(): a = 3 b = 4 c c22c = 5 if Triangle.is_valid(a, b, c): t = Triangle(a, b, c) print(t.perimeter()) print(Triangle.perimeter(t)) print(t.area()) print(Triangle.area(t)) else: print('无法构成三角形.')
练习1计算员工工资结算
class Employee(object): '''员工工资''' def __init__(self,name): self._name=name @property def name(self): return self._name def get_salary(self): ''' 获得月薪 :return: 返回结果 ''' pass class Manager(Employee): def get_salary(self): return 15000.0 class Programmer(Employee): def __init__(self,name): super().__init__(name) self._working_hour=0 @property def working_hour(self): return self._working_hour @working_hour.setter def working_hour(self,working_hour): self._working_hour=working_hour \ if working_hour>0 else 0 def get_salary(self): return 150.0*self._working_hour class Salesman(Employee): def __init__(self,name,sales=0): super().__init__(name) self._sales=sales @property def sales(self): return self._sales @sales.setter def sales(self,sales): self._sales=sales if sales>0 else 0 def get_salary(self): return 1200.0+self._sales*0.05 def main(): emps=[ Manager('刘备'),Programmer('诸葛亮'), Manager('曹操'),Salesman('荀彧'), Salesman('吕布'),Programmer('张辽'), Programmer('赵云') ] for emp in emps: if isinstance(emp,Programmer): emp.working_hour=int(input('请输入%s本月工作时间:' % emp.name)) elif isinstance(emp,Salesman): emp.sales=float(input('请输入%s本月销售额:'% emp.name)) #同样是接受get_salary这个消息 但是不同的员工表现出不同的行为 #因为三个子类都重写了get_salary方法 所以这个方法会表现出多态行为 print('%s本月工资为:¥%.2f元' % (emp.name,emp.get_salary())) if __name__ == '__main__': main()
练习2 五子棋游戏
#五子棋游戏 import pygame EMPTY = 0 BLACK = 1 WHITE = 2 black_color = [0, 0, 0] white_color = [255, 255, 255] class RenjuBoard(object): def __init__(self): self._board = [[]] * 15 self.reset() def reset(self): for row in range(len(self._board)): self._board[row] = [EMPTY] * 15 def move(self, row, col, is_black): if self._board[row][col]==EMPTY: self._board[row][col] = BLACK if is_black else WHITE return True return False def draw(self, screen): for index in range(1, 16): pygame.draw.line(screen, black_color, [40, 40 * index], [600, 40 * index], 1) pygame.draw.line(screen, black_color, [40 * index, 40], [40 * index, 600], 1) pygame.draw.rect(screen, black_color, [36, 36, 568, 568], 4) pygame.draw.circle(screen, black_color, [320, 320], 5, 0) pygame.draw.circle(screen, black_color, [160, 160], 5, 0) pygame.draw.circle(screen, black_color, [480, 480], 5, 0) pygame.draw.circle(screen, black_color, [480, 160], 5, 0) pygame.draw.circle(screen, black_color, [160, 480], 5, 0) for row in range(len(self._board)): for col in range(len(self._board[row])): if self._board[row][col] != EMPTY: ccolor = black_color \ if self._board[row][col] == BLACK else white_color pos = [40 * (col + 1), 40 * (row + 1)] pygame.draw.circle(screen, ccolor, pos, 20, 0) def main(): board = RenjuBoard() is_black = True pygame.init() pygame.display.set_caption('五子棋') screen = pygame.display.set_mode([640, 640]) screen.fill([255, 255, 0]) board.draw(screen) pygame.display.flip() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYUP: pass elif event.type == pygame.MOUSEBUTTONDOWN \ and event.button == 1: x,y = event.pos row =round ((y-40)/40) col = round((x-40)/40) if board.move(row,col,is_black): is_black = not is_black screen.fill([255, 255, 0]) board.draw(screen) pygame.display.flip() pygame.quit() if __name__ == '__main__': main()
相关文章推荐
- python学习总结(面向对象进阶)
- python学习总结之类对象
- Logic Java阶段学习总结--猜拳游戏(面向对象实例)
- 黑马程序员_C#面向对象学习知识总结1
- 黑马程序员_Java学习日记3_面向对象总结2
- Python面向对象学习资料汇总
- python学习总结三(python对象)
- 黑马程序员学习log第六篇基础知识:JAVA的面向对象之IO总结
- 黑马程序员_面向对象学习总结(二)
- 黑马程序员学习log第四篇基础知识:JAVA的面向对象之多线程总结
- 学习面向对象总结
- .NET 7期同学面向对象学习中问题总结
- 黑马程序员学习log第七篇基础知识:JAVA的面向对象之GUI总结
- C#面向对象基础学习总结
- 黑马程序员_Java学习日记2_面向对象总结1
- 黑马程序员学习log第九篇基础知识:JAVA的面向对象之正则表达式及反射总结
- python学习总结之类对象
- 黑马程序员学习log第五篇基础知识:JAVA的面向对象之集合总结
- 黑马程序员_Java学习日记5_面向对象总结4
- PHP 面向对象学习笔记总结