python 培训 广渠门
一、面向对象VS面向过程
1、面向过程
2、面向对象
二、类与对象
1、类和对象
(1)基本概念
类和对象的内存图如下:
2、实例成员
(1)实例变量
(2)实例方法:
3、类成员:
(1)类变量
(2)类方法
4、静态方法:
三、基本代码:
"""面向对象:考虑问题,从对象的角度出发.类:模板 抽象对象:具体 """class Wife:"""老婆"""# 1.数据成员 姓名 年龄 性别 ...def __init__(self, name, age, sex):# self "自己",调用当前方法的对象print(id(self))self.name = nameself.age = ageself.sex = sex# 2.方法成员 做饭 ...def cooking(self):print(id(self))print(self.name + "做饭")# 创建对象(实例化) # 调用 __init__(self,name,age,sex) 方法 w01 = Wife("丽丽", 21, "女") print(id(w01)) # 调用对象的方法 w01 将自身传入方法 w01.cooking()w02 = Wife("芳芳", 22, "男") w02.cooking() print(id(w02))# 在内存中,方法只有一份.而对象有多份.
"""实例成员 """# 创建实例成员,可以不在类中.(在实际项目中,仍然会在__init__方法中) # class Wife01: # pass # # # w01 = Wife01() # w01.name = "丽丽" # print(w01.name) # print(w01.__dict__)# 此时实例变量是:{'name': '莉莉'} # # w01 = Wife01() # print(w01.__dict__) # 此时实例变量是:{}class Wife02:def __init__(self,name):self.name = namew01 = Wife02("丽丽") w01.name = "莉莉" print(w01.__dict__)# 此时实例变量是:{'name': '莉莉'} print(w01.name)w01 = Wife02("丽丽") print(w01.__dict__)# 此时实例变量是:{'name': '丽丽'}# 创建实例成员,可以不在__init__中.(在实际项目中,仍然会在__init__方法中) class Wife03:def __init__(self,name):self.name = namedef fun01(self):self.age = 10print("fun01执行喽")w01 = Wife03("丽丽") # 通过对象调用实例方法,会自动传递对象地址. w01.fun01() # 通过类名调用实例方法, Wife03.fun01(w01) print(w01.age)
"""类成员 """ class ICBC:"""工商银行"""# 类变量 相当于被大家共享的"饮水机",moneys = 9999999# 类方法@classmethoddef print_total_moneys(cls):# print(ICBC.moneys)print("总行金额:",cls.moneys)# 实例方法def __init__(self,name,money):# 实例变量:相当于每个人的"杯子"self.money = moneyself.name = name# 从总行中,扣除当前支行的现金ICBC.moneys -= moneyi01 = ICBC("广渠门支行",100000) # 调用类变量 # print("总行金额:",ICBC.moneys) # 调用类方法,此时会自动传递类名进入方法 ICBC.print_total_moneys()i02 = ICBC("磁器口支行",100000) # print("总行金额:",ICBC.moneys) ICBC.print_total_moneys()
"""静态方法引入00 01 02 0310 11 12 1320 21 22 23需求:在某个元素基础上,获取每个方向,指定数量的元素.10 向右 3 --> 11 12 1321 向上 2 -->11 01..... """class Vector2:"""向量"""def __init__(self, x=0, y=0):self.x = xself.y = y# # 实例方法# def fun01(self):# pass## # 类方法# @classmethod# def fun02(cls):# pass## # 静态方法:得不到对象地址/也得不到类名# @staticmethod# def fun03():# pass# v01 = Vector2() # v01.fun01()# 隐式传递对象地址 # # Vector2.fun02()# 隐式传递类名 # # Vector2.fun03()def right():return Vector2(0,1)def up():return Vector2(-1,0)# ...# 在某个元素基础上,获取每个方向,指定数量的元素. def get_elements(list_target, v_pos, v_dir, count):result = []for i in range(count):# 位置 += 方向# 1 0 0 1 --> 1 1# 1 1 0 1 1 2# 1 2 0 1 1 3v_pos.x += v_dir.xv_pos.y += v_dir.yresult.append(list_target[v_pos.x][v_pos.y])return resultlist01 = [["00", "01", "02", "03"],["10", "11", "12", "13"],["20", "21", "22", "23"], ]# 10 向右 3 --> 11 12 13 # re01 = get_elements(list01,Vector2(1,0),Vector2(0,1),3) # 21 向上 2 -->11 01 # re02 = get_elements(list01,Vector2(2,1),Vector2(-1,0),2)# 10 向右 3 --> 11 12 13 re01 = get_elements(list01,Vector2(1,0),right(),3) print(re01) re02 = get_elements(list01,Vector2(2,1),up(),2) print(re02)
五、实例:
练习1
"""(1)学生student是一个类,具有姓名,年龄等数据;具有学习study,工作work等行为。对象:悟空同学,28岁。八戒同学,29岁。""" class Student:"""学生类"""def __init__(self,name,age):self.name = nameself.age = agedef study(self):print(str(self.age) + "学习")def work(self):print(self.name+"工作")# s01 悟空对象的地址 s01 = Student("悟空",28) s02 = Student("八戒",29)# 通过对象地址,调用对象方法,会自动传递对象地址. s01.study() s02.work()
练习2:
# 1. 在控制台中输入3个敌人,存入列表. # 2. 将敌人列表输出(调用print_self)到控制台class Enemy:"""敌人类"""def __init__(self,name='',hp=0,atk=0,atk_speed=0):"""构造函数:param name: 敌人姓名:param hp: 血量:param atk: 攻击力:param atk_speed:攻击速度"""self.name = nameself.hp = hpself.atk = atkself.atk_speed = atk_speeddef print_self(self):"""打印对象:return:"""print(self.name,self.hp,self.atk,self.atk_speed,sep='--')def input_control(msg):"""控制输入数据:param msg: 提示信息:return: 返回正确的录入值"""while True:try:return int(input(msg))except:print('输入有误!')def get_enemy_list(n):"""获取敌人列表:param n: 敌人个数:return: 敌人列表"""result_list = []for i in range(n):enemy = Enemy()enemy.name = input('请输入姓名:')enemy.hp = input_control('请输入血量')enemy.atk = input_control('请输入攻击力')enemy.atk_speed = input_control('请输入攻击速度')result_list.append(enemy)return result_listdef get_enemy_by_name(name_value):lst = []for item in enemy_list:if item.name == name_value:lst.append(item)for i in lst:i.print_self()enemy_list = get_enemy_list(3) for item in enemy_list:item.print_self()get_enemy_by_name('张三')
练习3:
"""二维列表工具 """class Vector2:"""向量"""def __init__(self, x=0, y=0):self.x = xself.y = y# 将函数转移到类中,就是静态方法.@staticmethoddef right():return Vector2(0, 1)@staticmethoddef up():return Vector2(-1, 0)@staticmethoddef left():return Vector2(0, -1)@staticmethoddef down():return Vector2(1, 0)@staticmethoddef right_up():return Vector2(-1, 1)class DoubleListHelper:"""二维列表助手类定义:在开发过程中,所有对二维列表的常用操作."""@staticmethoddef get_elements(list_target, v_pos, v_dir, count):result = []for i in range(count):v_pos.x += v_dir.xv_pos.y += v_dir.yresult.append(list_target[v_pos.x][v_pos.y])return result# 测试............. list01 = [["00", "01", "02", "03"],["10", "11", "12", "13"],["20", "21", "22", "23"], ]# 10 向右 3 --> 11 12 13 re01 = DoubleListHelper.get_elements(list01, Vector2(1, 0), Vector2.right(), 3) print(re01)# 练习1:在二维列表中,获取23位置,向左,3个元素. re02 = DoubleListHelper.get_elements(list01, Vector2(2, 3), Vector2.left(), 3) # 练习2:在二维列表中,获取02位置,向下,2个元素. re02 = DoubleListHelper.get_elements(list01, Vector2(0, 2), Vector2.down(), 2) # 练习3:在二维列表中,获取20位置,右上,2个元素. re02 = DoubleListHelper.get_elements(list01, Vector2(2, 0), Vector2.right_up(), 2) print(re02)
练习4:
"""练习: 对象计数器 创建老婆类(名字...),随意实例化对象.统计老婆数量(定义方法)画出内存图 """class Wife:# 计数器count = 0@classmethoddef get_count(cls):return Wife.countdef __init__(self,name):# 实例变量self.name = name# 统计Wife.count += 1w01 = Wife("王超") w02 = Wife("马汉") # 通过类名,访问类方法 print(Wife.get_count())
练习5:
"""以面向对象的思想,描述下列场景.提示:对象与对象数据不同,类与类行为不同.张三 教 李四 学习python李四 教 张三 玩游戏张三 工作 挣了8000元李四 工作 挣了3000元 """class Person:def __init__(self, name):# 人的姓名self.name = name# 人会的所有技能self.__skills = []self.__total_money = 0# 只读属性@propertydef skills(self):# return self.__skills # 返回可变对象地址,意味着类外仍然可以操作可变对象return self.__skills[:] # 返回新的可变对象地址,意味着类外仍然操作的是新可变对象,不影响原对象.# 备注:每次通过切片返回新对象,都会另外开辟空间创建新对象,占用过多内存.# 只读属性@propertydef total_money(self):return self.__total_money@propertydef name(self):return self.__name@name.setterdef name(self,value):self.__name = valuedef teach(self, person_other, str_skill):# person_other 的技能列表,增加str_skillperson_other.__skills.append(str_skill)print(self.name, "教了", person_other.name, str_skill)def work(self, money):self.__total_money += moneyprint(self.name, "工作挣了", money, "元")zs = Person("张三") ls = Person("李四") # 张三 教 李四 学习python zs.teach(ls, "python") # 李四 教 张三 玩游戏 ls.teach(zs, "游戏")zs.work(8000) ls.work(4000)#************************ zs = Person("张三") # zs.skills = [] # 不能改 # 如果skills属性,返回的是__skills,那么仍然可以操作私有列表 # __skills[:],那么操作的是新列表 zs.skills.append("python") print(zs.skills)
练习6:
"""创建技能类(技能名称,冷却时间,持续时间,攻击距离......)要求:使用属性封装变量创建技能列表(技能对象的列表)-- 查找名称是"降龙十八掌"的技能对象-- 查找名称是持续时间大于10秒的的所有技能对象-- 查找攻击距离最远的技能对象-- 按照持续时间,对列表升序排列. """class SkillData:def __init__(self, name, cd, time, distance):self.name = nameself.cd = cdself.time = timeself.atk_distance = distance@propertydef name(self):return self.__name@name.setterdef name(self, value):self.__name = value@propertydef cd(self):return self.__cd@cd.setterdef cd(self, value):self.__cd = value@propertydef time(self):return self.__time@time.setterdef time(self, value):self.__time = value@propertydef atk_distance(self):return self.__atk_distance@atk_distance.setterdef atk_distance(self, value):self.__atk_distance = valuedef print_self(self):print(self.name, self.cd, self.time, self.atk_distance)list_skills = [SkillData("降龙十八掌", 60, 10, 5),SkillData("如来神掌", 50, 5, 15),SkillData("六脉神剑", 80, 20, 8),SkillData("一阳指", 20, 50, 15),SkillData("冷酷追击", 15, 30, 9), ]# -- 查找名称是"降龙十八掌"的技能对象 for item in list_skills:if item.name == "降龙十八掌":item.print_self()# -- 查找名称是持续时间大于10秒的的所有技能对象 result = [] for item in list_skills:if item.time > 10:result.append(item)# -- 查找攻击距离最远的技能对象 result = list_skills[0] for i in range(1, len(list_skills)):# 后面的技能对象if result.atk_distance < list_skills[i].atk_distance:result = list_skills[i]# result.atk_distance = list_skills[i].atk_distanceresult.print_self()# -- 按照持续时间,对列表升序排列. for r in range(len(list_skills) - 1):for c in range(r + 1, len(list_skills)):if list_skills[r].time > list_skills[c].time:list_skills[r],list_skills[c] = list_skills[c],list_skills[r]# 请用调试,查看列表的取值. print(list_skills)
python 培训 广渠门相关推荐
- Python培训:Python有哪些函数?你了解几种?
本期小编要为大家带来的Python教程就是关于Python函数这方面的,我们都知道Python函数,一般是指组织好的.可重复使用的.用来实现单一或相关联功能的代码段,Python函数包含系统中自带的一 ...
- Python培训教程:Python有哪些比较重要的内置函数?
学习Python技术或者参加Python工作的小伙伴们应该都知道,在Python编程语言中会经常出现很多内置函数,很少有人清楚这些函数,但是它的功能是不可小觑的,下面小编就为大家详细介绍一下Pytho ...
- Python培训教程分享:10款超好用的Python开发工具
学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python ...
- Python培训教程分享:Python异常机制
在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...
- 参加完Python培训后有哪些就业方向
很多学习Python技术的同学都是为了后面能够找到一个好的工作,对于大家来说了解了Python的就业方向,后面就可以根据自己的能力来选择对应的工作岗位了,那么下面小编就为大家详细的介绍一下参加完Pyt ...
- Python培训教程分享:有哪些值得使用的爬虫开源项目?
相信很多同学在学习Python技术的时候,都有学习到Python爬虫技术,爬虫技术在各大互联网公司都是非常常见的,可以帮助我们获取各种网站的信息,比如微博.B站.知乎等,本篇Python培训教程分享为 ...
- Python培训教程分享:visual studio编写python怎么样?
本期小编要为大家介绍的Python培训教程就是关于"visual studio编写python怎么样?"的问题,但答案当然是可以的,据了解,vs2017.vs2019都集成了pyt ...
- Python培训分享:Python新版本中的6个新特性
Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍. Python培 ...
- Python培训教程分享:Python中选择结构是什么
越来越多的人开始报名学习Python技术,那么学习Python技术不是一两天就能学会的,本期小编为大家推荐的Python培训教程主要讲的是"Python中选择结构是什么",下面来看 ...
最新文章
- javascrip 常用属性
- Spring Boot Runner启动器
- [ARM异常]-armv8/armv9异步异常类型、路由、屏蔽
- 它来了,阿里架构师的“Java多线程+并发编程”知识点详解手册,限时分享
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
- Oracle学习笔记之触发器
- efsframe java_EfsFrame(java开发框架)
- 多媒体计算机技术未来的发展方向,多媒体技术的发展现状及未来
- 如果报华为网络工程师中级培训班一般学费多少?
- Ubuntu 重置密码
- 【C语言】创建各类三角形图案
- 复旦大学数学学院 17 级本科生对每周一题的评价
- disparity和parallax的区别
- STM32仿真器下载配置
- debian怎么安装oracle数据库,Debian上安装Oracle客户端
- 《天道》解读三:什么是天道?
- 基于MR采样用户定位的高负荷扇区优化
- 计算机应用与需求相结合,计算机应用人才培养与企业需求的有效对接
- dropdownList获取值
- P4606 [SDOI2018]战略游戏
热门文章
- C# .Net5 OpenCV人脸识别 提取人脸特征提取
- 投屏功能或调节亮度没反应的解决方法
- 医药之家:高景气度将延续!医疗器械行业迎政策利好
- Resolved [org.springframework.jdbc.BadSqlGrammarException
- 对卷积的定义和意义的通俗解释
- 安装gtsam的matlab工具箱
- php 经纬度两点间距离公式,PHP根据两点间的经纬度计算距离,php两点经纬度计算...
- EDIUS和Premiere,你该选择哪个?
- uniapp获取手机号
- Rootkit与后门隐藏