python进阶(4):初始面向对象
一切皆对象!
预习:
#仿照正方形类写一个圆形类
class Square:
def __init__(self,length_of_side):
self.length_of_side = length_of_side def square(self):
'面积'
return self.length_of_side * self.length_of_side def perimeter(self):
'周长'
return self.length_of_side * 4 正方形 = Square(2)
print(正方形.square())
print(正方形.perimeter())
预习题
本篇导航:
一、面向过程-->面向对象
面向过程:根据业务逻辑从上到下堆叠代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”
二、初始类和对象
python中一切皆为对象,类型的本质就是类,所以你已经使用了很长时间的类了
在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。
1、类
#定义一个人类 class类关键字和定义函数时的def同理
class Person:
role = 'person'
#role变量 属性—— 静态属性
def walk(self):
#self必须写(作用后面会介绍)方法,也叫动态属性
print("person is walking..."
类
属性引用(类名.属性)
class Person:
role = 'person'
def walk(self):
print("person is walking...") print(Person.role) #查看人的role属性
print(Person.walk) #引用人的走路方法,注意,这里不是在调用
引用
实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
语法:对象名 = 类名(参数)
class Person: #定义一个人类
role = 'person'
def __init__(self,name):
self.name = name # 每一个角色都有自己的昵称; 苍井井 = Person('苍井井')
小泽泽 = Person('小泽泽')
#实例化的过程就是类——>对象的过程
实例化
类名()就等于在执行Person.__init__(),执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。
查看属性&调用方法
print(苍井井.name) #查看对象属性直接 对象名.属性名
self:在实例化时自动将对象/实例本身传给__init__的第参数,必须写可以有别名但不建议用别名
类补充
一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
类属性的补充
2、对象
我们来写一个人狗大战:现在我们需要对我们的类做出一点点改变。人类除了可以走路之外应该具备一些攻击技能
class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人
def __init__(self, name, aggressivity, life_value):
self.name = name # 每一个角色都有自己的昵称;
self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
self.life_value = life_value # 每一个角色都有自己的生命值;
def attack(self,dog):
# 人可以攻击狗,这里的狗也是一个对象。
dog.life_value -= self.aggressivity
print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.life_value))
人类
对象是关于类而实际存在的一个例子,即实例。对象/实例只有一种作用:属性引用
苍井井 = Person('苍井井',10,1000)
print(苍井井.name)
print(苍井井.aggressivity)
print(苍井井.life_value)
你也可以引用一个方法,因为方法也是一个属性(动态属性)。
class 类名:
类属性 = None
def __init__(self,参数1,参数2):
self.对象的属性1 = 参数1
self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西
#类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
#括号里传参数,参数不需要传self,其他与init中的形参一一对应
#结果返回一个对象
对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
#对象增加属性
对象.新的属性名 = 1000
小结
对象之间的交互
既然我们要做人狗大战,我们已经有人了,现在我们要再创建一个狗类,狗咬人,我们给狗一个bite方法。有了狗类,我们再实例化一只实实在在的狗出来。人和狗就可以打架了。
class Dog: # 定义一个狗类
role = 'dog' # 狗的角色属性都是狗
def __init__(self, name, breed, aggressivity, life_value):
self.name = name # 每一只狗都有自己的昵称;
self.breed = breed # 每一只狗都有自己的品种;
self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
self.life_value = life_value # 每一只狗都有自己的生命值;
def bite(self,people):
# 狗可以咬人,这里的狗也是一个对象。
people.life_value -= self.aggressivity
print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value))
狗类
实例化一只狼狗:
egon = Dog('egon','狼狗',100,20000) #创造了一只实实在在的狗egon
交互 苍井井 打了 egon 一下/egon 咬了 苍井井 一下
a = Person("苍井井",10,1000)
b = Dog("egon","狼狗",100,20000)
a.attack(b)
b.bite(a)
交互
完整的人狗大战代码:
class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人
def __init__(self, name, aggressivity, life_value):
self.name = name # 每一个角色都有自己的昵称;
self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
self.life_value = life_value # 每一个角色都有自己的生命值;
def attack(self,dog):
# 人可以攻击狗,这里的狗也是一个对象。
dog.life_value -= self.aggressivity
print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.life_value)) class Dog: # 定义一个狗类
role = 'dog' # 狗的角色属性都是狗
def __init__(self, name, breed, aggressivity, life_value):
self.name = name # 每一只狗都有自己的昵称;
self.breed = breed # 每一只狗都有自己的品种;
self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
self.life_value = life_value # 每一只狗都有自己的生命值;
def bite(self,people):
# 狗可以咬人,这里的狗也是一个对象。
people.life_value -= self.aggressivity
print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value)) a = Person("苍井井",10,1000)
b = Dog("egon","狼狗",200,20000)
while True :
a.attack(b)
b.bite(a)
if a.life_value <= 0 :
print(a.name+"被"+b.name+"咬死了!")
break
if b.life_value <= 0 :
print(b.name + "被" + a.name + "咬死了!")
break
egon大战苍井井
三、类命名空间与对象、实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
静态属性就是直接在类中定义的变量,动态属性就是定义在类中的方法
其中类的数据属性是共享给所有对象的
print(id(a.role))
print(id(Person.role)) #相同
而类的动态属性是绑定到所有对象的
print(a.attack)
print(Person.attack) #不同
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性,在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
四、面向对象的组合用法
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
class Weapon:
'''
这是一个游戏里武器的数据类型
'''
def __init__(self,name, price, aggrev, life_value):
self.name = name #武器名称
self.price = price #武器价格
self.aggrev = aggrev #武器伤害加成
self.life_value = life_value #武器血量加成 def update(self, obj): #obj就是要带这个装备的人
obj.money -= self.price # 用这个武器的人花钱买所以对应的钱要减少
obj.aggressivity += self.aggrev # 带上这个装备可以让人增加攻击
obj.life_value += self.life_value # 带上这个装备可以让人增加生命值 def prick(self, obj): # 这是该装备的主动技能,绞龙
obj.life_value -= 3000 # 假设攻击力是3000
武器类
组合交互人狗大战完整代码:
class Person: # 定义一个人类
'''
这是一个游戏里人物的数据类型
'''
role = 'person' # 人的角色属性都是人
def __init__(self, name, aggressivity, life_value):
self.name = name # 每一个角色都有自己的昵称;
self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
self.life_value = life_value # 每一个角色都有自己的生命值;
def attack(self,dog):
# 人可以攻击狗,这里的狗也是一个对象。
dog.life_value -= self.aggressivity
print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.life_value)) class Dog: # 定义一个狗类
'''
这是一个游戏里狗的数据类型
'''
role = 'dog' # 狗的角色属性都是狗
def __init__(self, name, breed, aggressivity, life_value):
self.name = name # 每一只狗都有自己的昵称;
self.breed = breed # 每一只狗都有自己的品种;
self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
self.life_value = life_value # 每一只狗都有自己的生命值;
def bite(self,people):
# 狗可以咬人,这里的狗也是一个对象。
people.life_value -= self.aggressivity
print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value)) class Weapon:
'''
这是一个游戏里武器的数据类型
'''
def __init__(self,name, price, aggrev, life_value):
self.name = name #武器名称
self.price = price #武器价格
self.aggrev = aggrev #武器伤害加成
self.life_value = life_value #武器血量加成 def update(self, obj): #obj就是要带这个装备的人
obj.money -= self.price # 用这个武器的人花钱买所以对应的钱要减少
obj.aggressivity += self.aggrev # 带上这个装备可以让人增加攻击
obj.life_value += self.life_value # 带上这个装备可以让人增加生命值 def prick(self, obj): # 这是该装备的主动技能,绞龙
obj.life_value -= 3000 # 假设攻击力是3000
print("{0}发动主动技:蛟龙==>{1}剩余血量{2}".format(self.name, obj.name, obj.life_value)) a = Person("苍井井",10,1000)
b = Dog("egon","狼狗",200,20000)
c = Weapon("蛟龙鞭",1000,40,2000)
a.money = 2000 #判断是否买的起武器
if a.money > c.price :
c.update(a)
a.weapon = c #大战开始
while True :
a.attack(b)
if b.life_value <= 0 :
print(b.name + "被" + a.name + "打死了!")
break
a.weapon.prick(b)
if b.life_value <= 0 :
print(b.name + "被" + a.name + "绞死了!")
break
b.bite(a)
if a.life_value <= 0 :
print(a.name+"被"+b.name+"咬死了!")
break
egon大战苍井井升级版
思维导图:
预习答案:
#圆形类
class Circle:
def __init__(self,radius):
self.radius = radius def area(self):
'面积'
return self.radius **2 * 3.14 def perimeter(self):
'周长'
return self.radius * 2 *3.14 圆 = Circle(8)
print(圆.area())
print(圆.perimeter())
预习答案
python进阶(4):初始面向对象的更多相关文章
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
- Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)
Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...
- Python进阶学习之面向对象
目录 面向对象 私有属性 面向对象 python也有面向对象的编程,它与C++中的类有点相似.它也只是运算符重载,继承. class Test: num=0 def __init__(self): ...
- Python进阶 函数式编程和面向对象编程等
函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶(十三)----面向对象
Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...
- python进阶_浅谈面向对象进阶
python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class F ...
- Python进阶之函数式编程
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- python进阶强化学习
最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类 ...
随机推荐
- 【LeetCode】110. Balanced Binary Tree
题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...
- visual studio for mac在线安装网络错误
vs2017 for mac 终于出正式版了,兴冲冲的准备摆脱虚拟机. 官网https://www.visualstudio.com/zh-hans/vs/visual-studio-mac/下了安装 ...
- 关于STM32单片机的IAP实现
基于STM32F103单片机的IAP实现(虽然该篇文章不会详细写出实现细节,但是会从一个全局的角度讲述,实际的实现细节只需根据datasheet即可完成). 一.基础概念 什么是IAP?IAP即在应用 ...
- java环境配置,试用和基本数据结构
一.java环境配置 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:jdk文件所在的路经变量名:CLASS ...
- JavaWeb 后端 <十四> 文件上传下载
1.文件上传与下载 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 1.1 文件上传 文件上传,要点: 前台: ...
- asp.net验证码的编写
很多时候我们在登录什么网站的时候,除了需要什么用户名和密码之外,有的还需要验证码那么在asp.net中这个验证码如何编写和设计,今天我就来给大家说一下: 首先创建一个页面名字随便起一个,我们这里叫做C ...
- C# 设计模式之空对象模式
最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...
- GitHub 入门教程
一.前言 编程进阶的道路是坎坷的,没有任何捷径.这个时期只能是积累.吸收.学习.坚持,做到量的积累,到质的飞跃 古语有云:'书山有路,勤为径'.'不积跬步,无以至千里' 编程是一个动手实践性的学科,多 ...
- ABAP,学习不一样的EXCEL导出----XLSX Workbench
这个工具是在查找ABAP导出EXCEL资料的时候发现,是国外的一位大牛自己开发的开源项目,体验了一番,确实很好用. 工具特点: No ABAP Programming Skills are requi ...
- Java调度实现
根据自己在项目中用到的调度,简单说说:(如有不正确的地方,请留言...) Java调度:他是用来解决访问时间慢的手段. 通俗的讲就是为需要的数据(你需要展示的数据)建立一张中间表存放,提前把数据读出来 ...