目录
面对对象和面对过程编程
实际编程过程中,面向过程结合面向对象一起使用。
什么是面向对象
指的是一门编程思想
什么是面向过程编程
核心是'过程‘二字,过程指的是做事情的步骤,比如先做什么,在做什么
基于该编程思想编写程序,就好比一条工厂的流水线,一种机械式的思维方式
优点:逻辑清晰,复杂的问题流程化,进而简单化
缺点:可扩展性差
什么是面对对象编程
核心是’对象‘二字,对象指的是特征和技能的结合体
基于该编程思想编写程序,就好比在创造世界,一种上帝式的思维方式
优点:可扩展性高
缺点:编写程序的复杂程度要远高于面向过程编程思想
类
对象是特征和技能的结合体,类是一系列对象相同的特征和技能的集合体
类的定义
class 类名: 特征 技能
- 类名必须要遵循驼峰体
- 通过调用类名,来创造对象
定义类时发生的事情
类在定义时,会产生一个空的名称空间
会把类内部所有名字,扔进类的名称空间中
注意:类在定义阶段就已经产生好了名称空间,执行python文件时会执行类内部的代码
__dict__
和.
.
可以对类内部的特征进行增删改查的操作__dict__
只能进行查的操作- 对象也有
__dict__
class OldStudent: schoo = 'oldboy' def learn(self): print('learn') # 查看类的名称空间内的所有名字 print(OldStudent.__dict__) # type:字典 # .可以对类中的名字进行修改,而__dict__不能 OldStudent.school = 'oldgirl' print(OldStudent.school) # ‘oldgirl
对象
调用类即会产生对象,也叫实例化对象
名称空间
- 类的名称空间在定义阶段就已经产生了
- 对象的名称空间在调用类的时候产生
__init__
函数
为了解决对象和对象之间特征和技能一样的问题产生,可以为对象初始化某些属性
- 在调用类时,自动触发该函数
class OldStudent: school = 'oldboy' # 共有属性 def __init__(self,name,age): # 特有属性 self.name = name self.age = age def learn(): print('learn') stu1 = OldStudent('wick',24) # 实例化对象
调用类发生的事情
首先产生一个空的对象,即产生'对象的名称空间'
自动触发
__init__
把对象本身以及括号内的参数一并传给init函数
总结:调用类会产生一个对象,调用类的过程叫做类的实例化,产生的对象称之为类的一个实例
对象与类的查找顺序
- 对象,优先查找对象本身
- 类,对象中找不到就去类中找
- 报错,类中也找不到就报错
对象绑定方法的特殊之处
- 由类调用类内部的函数,该函数只是一个普通的函数,普通函数需要接受几个参数,就得传入几个参数
- 由对象来调用称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同的对象传入该绑定方法中
总结:对象绑定方法,是由对象来调用的额,特殊之处就是把对象当作第一个参数传入该方法中
python中一切皆对象
八大数据类型内置方法的实现都是通过定义类,然后实例化一个对象来实现的
英雄联盟小游戏练习
import random import time class Yasso: camp = 'lonia' def __init__(self,name): self.name = name self.atk = 48 self.armor = 15 self.health = 430 self.money = 1200 def attack(self, zed): damage = self.atk - zed.armor zed.health -= damage print(f'''{self.name}攻击了{zed.name},伤害:-{damage} {zed.name}剩余血量:{zed.health}\n''') if zed.health <= 0: return True class Zed: camp = 'shadow' def __init__(self,name): self.name = name self.atk = 49 self.armor = 17 self.health = 445 self.money = 1200 def attack(self, yasso): damage = self.atk - yasso.armor yasso.health -= damage print(f'''{self.name}攻击了{yasso.name},伤害:-{damage} {yasso.name}剩余血量:{yasso.health}\n''') if yasso.health <= 0: return True class Belt: weapon_type = 'defence' def __init__(self,name): self.name = name self.price = 1000 self.health = 380 def equip(self,obj): obj.money -= self.price obj.health += self.health class BigSword: weapon_type = 'attack' def __init__(self,name): self.name = name self.price = 1200 self.atk = 60 def equip(self,obj): obj.money -= self.price obj.atk += self.atk wick = Zed('火影劫') tank = Yasso('快乐风男') titan = Belt('巨人腰带') storm = BigSword('暴风大剑') print(f''' 玩家wick使用英雄{wick.name} 生命值:{wick.health} 攻击力:{wick.atk} 护甲:{wick.armor} 金币:{wick.money}\n''') time.sleep(1.8) print(f'''玩家tank使用英雄{tank.name} 生命值:{tank.health} 攻击力:{tank.atk} 护甲:{tank.armor} 金币:{tank.money}\n''') time.sleep(1.8) if wick.money >= storm.price: wick.storm = storm storm.equip(wick) print(f'{wick.name}购买了{storm.name}') time.sleep(1) if tank.money >= titan.price: tank.titan = titan titan.equip(tank) print(f'{tank.name}购买了{titan.name}') time.sleep(1) print(f''' 玩家wick使用英雄{wick.name} 生命值:{wick.health} 攻击力:{wick.atk} 护甲:{wick.armor} 金币:{wick.money} 装备:{wick.storm.name}\n''') time.sleep(1.8) print(f'''玩家tank使用英雄{tank.name} 生命值:{tank.health} 攻击力:{tank.atk} 护甲:{tank.armor} 金币:{tank.money} 装备:{tank.titan.name}\n''') time.sleep(1.8) while True: rand = random.randint(1,3) if rand == 1: res = wick.attack(tank) time.sleep(0.8) if res: print(f'''玩家wick使用{wick.name}很轻松的击杀了菜鸡玩家tank使用的{tank.name}''') break if rand == 2: res1 = tank.attack(wick) time.sleep(0.8) if res1: print(f'''玩家tank使用{tank.name}卑鄙无耻的侥幸击杀了玩家wick使用的{wick.name}''') break