一、面向对象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 培训 广渠门相关推荐

  1. Python培训:Python有哪些函数?你了解几种?

    本期小编要为大家带来的Python教程就是关于Python函数这方面的,我们都知道Python函数,一般是指组织好的.可重复使用的.用来实现单一或相关联功能的代码段,Python函数包含系统中自带的一 ...

  2. Python培训教程:Python有哪些比较重要的内置函数?

    学习Python技术或者参加Python工作的小伙伴们应该都知道,在Python编程语言中会经常出现很多内置函数,很少有人清楚这些函数,但是它的功能是不可小觑的,下面小编就为大家详细介绍一下Pytho ...

  3. Python培训教程分享:10款超好用的Python开发工具

    学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python ...

  4. Python培训教程分享:Python异常机制

    ​ 在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...

  5. 参加完Python培训后有哪些就业方向

    很多学习Python技术的同学都是为了后面能够找到一个好的工作,对于大家来说了解了Python的就业方向,后面就可以根据自己的能力来选择对应的工作岗位了,那么下面小编就为大家详细的介绍一下参加完Pyt ...

  6. Python培训教程分享:有哪些值得使用的爬虫开源项目?

    相信很多同学在学习Python技术的时候,都有学习到Python爬虫技术,爬虫技术在各大互联网公司都是非常常见的,可以帮助我们获取各种网站的信息,比如微博.B站.知乎等,本篇Python培训教程分享为 ...

  7. Python培训教程分享:visual studio编写python怎么样?

    本期小编要为大家介绍的Python培训教程就是关于"visual studio编写python怎么样?"的问题,但答案当然是可以的,据了解,vs2017.vs2019都集成了pyt ...

  8. Python培训分享:Python新版本中的6个新特性

    Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍. Python培 ...

  9. Python培训教程分享:Python中选择结构是什么

    越来越多的人开始报名学习Python技术,那么学习Python技术不是一两天就能学会的,本期小编为大家推荐的Python培训教程主要讲的是"Python中选择结构是什么",下面来看 ...

最新文章

  1. javascrip 常用属性
  2. Spring Boot Runner启动器
  3. [ARM异常]-armv8/armv9异步异常类型、路由、屏蔽
  4. 它来了,阿里架构师的“Java多线程+并发编程”知识点详解手册,限时分享
  5. bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
  6. Oracle学习笔记之触发器
  7. efsframe java_EfsFrame(java开发框架)
  8. 多媒体计算机技术未来的发展方向,多媒体技术的发展现状及未来
  9. 如果报华为网络工程师中级培训班一般学费多少?
  10. Ubuntu 重置密码
  11. 【C语言】创建各类三角形图案
  12. 复旦大学数学学院 17 级本科生对每周一题的评价
  13. disparity和parallax的区别
  14. STM32仿真器下载配置
  15. debian怎么安装oracle数据库,Debian上安装Oracle客户端
  16. 《天道》解读三:什么是天道?
  17. 基于MR采样用户定位的高负荷扇区优化
  18. 计算机应用与需求相结合,计算机应用人才培养与企业需求的有效对接
  19. dropdownList获取值
  20. P4606 [SDOI2018]战略游戏

热门文章

  1. C# .Net5 OpenCV人脸识别 提取人脸特征提取
  2. 投屏功能或调节亮度没反应的解决方法
  3. 医药之家:高景气度将延续!医疗器械行业迎政策利好
  4. Resolved [org.springframework.jdbc.BadSqlGrammarException
  5. 对卷积的定义和意义的通俗解释
  6. 安装gtsam的matlab工具箱
  7. php 经纬度两点间距离公式,PHP根据两点间的经纬度计算距离,php两点经纬度计算...
  8. EDIUS和Premiere,你该选择哪个?
  9. uniapp获取手机号
  10. Rootkit与后门隐藏