> 文档中心 > 【Python从零到壹】用Python实现植物大战僵尸里的面向对象

【Python从零到壹】用Python实现植物大战僵尸里的面向对象

编程的两个思想: 面向对象和面向过程
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。

优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。

缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。

应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。

面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来

面向对象的优缺点:
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。

应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方

两者相辅相成,并不是对立的,都是为了解决问题的。

1. 类和对象

类是多个类似的事物组成的群体的统称。 能够帮助我们快速理解和判断事物的性质。

类:具有相同特征的一类事物(人、狗、老虎,手机)

对象/实例:具体的某一个事物(你的同学张三、楼下的旺财)

实例化:类——>对象的过程

比如一说手机你就想到他的形状,里面有收发短信,打电话的功能,也能上网。 但你能知道我说的手机在上哪个网站吗?
不能,所以手机就是一个类,它具有相同的属性方法; 而具体的用手机做了什么,谁的手机,就是手机类的一个对象。
比如小米手机

Python中一切皆为对象,列表对象,数字对象

用变量表示特征,用函数表示技能,具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。

2. 类的创建和编写

a) 定义一个类

语法:
class Student:
pass

类的组成:

  • 类名的规范: 是由一个或者多个单词组成的,要求每个单词的首字母大写,其余的小写;
  • Python中一切皆对象,需要开辟内存空间
# 作者:互联网老辛# 开发时间:2021/4/4/0004 6sclass Student:    passprint(id(Student))print(type(Student))print(Student)

【Python从零到壹】用Python实现植物大战僵尸里的面向对象
看到ID的数值,就知道这里的类是开辟了一块内存空间。

案例1:学生类模板

# 作者:互联网老辛# 开发时间:2021/4/4/0004 6sclass Student:    native_pace='山东' # 直接写在类里的变量,成为属性 ,学生的地方属性是山东    #实例方法: 在类之外定义称为函数,在类之内定义成为方法    def __init__(self,name,age): self.name=name self.age=age  #self.name称为实体属性,进行了一个复制操作,将局部变量name赋值给实体的属性    def eat(self): print('正在吃饭') # 这是一个方法,叫吃饭方法,也叫动态属性    #静态方法    @staticmethod    def method(): print('我使用了statticmethod进行修饰,所以我叫静态方法')    @classmethod    #这种叫类方法    def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰')

通过这个案例来了解,静态方法,实例方法,以及类方法和动态属性

b) 创建对象

对象的创建又称为类的实例化

语法: 实例名=类名()
类名+括号就是实例化,会自动触发 _ init _函数运行,可以用它来为每个实例定制自己的特征。

# 作者:互联网老辛# 开发时间:2021/4/4/0004 6sclass Student:    native_pace='山东' # 直接写在类里的变量,成为属性    #实例方法: 在类之外定义称为函数,在类之内定义成为方法    def __init__(self,name,age): self.name=name self.age=age  #self.name称为实体属性,进行了一个复制操作,将局部变量name赋值给实体的属性    def eat(self): print('正在吃饭')    #静态方法    @staticmethod    def method(): print('我使用了statticmethod进行修饰,所以我叫静态方法')    @classmethod    #这种叫类方法    def cm(cls): print('我是类方法,因为我使用了classmethod进行修饰')## 创建Student的对象stu1=Student('互联网老辛',40)stu1.eat()print(stu1.name)print(stu1.age)

【Python从零到壹】用Python实现植物大战僵尸里的面向对象
实例化的过程就是: 类——>对象的过程。

我们原本只有一个Student类,产生了一个stu1对象,这个对象有自己的具体命令,年龄,以及吃饭的方法。

案例2

# 作者:互联网老辛# 开发时间:2021/4/4/0004 6sclass Person:    role='person' #角色的属性是人    def __init__(self,name): self.name = name #每个角色有一个自己的名字    def walk(self): print("person can walking")##实例化过程p1=Person('张三')  #类名()就相当于执行 Person.__init__()#这里你可以理解为 p1={'name':'张三',’walk':'walk'}print(p1.name) #查看属性直接 对象名,属性名print(p1.walk()) # 调用方法, 对象名.方法名

大部分的注释都写在代码里了,可以看代码去理解

再给刚才的代码增加功能,比如人不但可以走路还可以攻击狗

class Person:    role='person' #角色的属性是人    def __init__(self,name,aggressivity,life_value): self.name = name #每个角色有一个自己的名字 self.aggressivity = aggressivity # 每个角色都有一个攻击力 self.life_value = life_value #每个角色都有一个生命值    def walk(self): print("person can walking")    def attack(self,dog): dog.life_value -= self.aggressivity##实例化过程p1=Person('张三',10,1000)  #类名()就相当于执行 Person.__init__()#这里你可以理解为 p1={'name':'张三',’walk':'walk'}print(p1.name) #查看属性直接 对象名,属性名print(p1.walk()) # 调用方法, 对象名.方法名print(p1.aggressivity)print(p1.life_value)

c) 类属性,类方法,静态方法

  • 类属性: 类中方法外的变量称为类属性,该类被所有对象共享
  • 类方法: 使用@classmethod修饰方法,使用类名直接访问
  • 静态方法 使用@staticmethod修饰的方法,使用类名直接访问的方法

Print(Student.native_place) 访问类属性
student.cm 调用类方法
student.sm 调用静态方法

用Python实现植物大战僵尸里的面向对象

class Flora:    role='flora' # 定义一个植物类,属性是植物    def __init__(self,name,aggressivity,life_value,money): self.name=name self.aggressivity=aggressivity ## 每个角色都有自己的攻击力 self.life_value=life_value #每个角色都有自己生命值 self.moeny=money    def attack(self,corpse): # 植物都可以攻击僵尸,僵尸的生命值会根据人的攻击而下降 corpse.life_value -= self.aggressivityclass Corpse:    rols='corpse'  #僵尸类,属性都是僵尸    def __init__(self,name,aggressivity,life_value): self.name = name self.aggressivity = aggressivity  ## 每个角色都有自己的攻击力 self.life_value = life_value  # 每个角色都有自己生命值    def eat(self,flora): flora.life_value-=self.aggressivity #僵尸可以吃植物,植物的生命力会下降class Weapon: ## 武器库    def __init__(self,name,price,aggrev,life_value):self.name=nameself.price=priceself.aggrev=aggrevself.life_value=life_value    def update(self,obj): obj.money -= self.price  # 购买武器的植物钱少钱少 obj.aggressivity += self.aggrev  #攻击力增加 obj.life_value += self.life_value  #生命值增加    def prick(self,obj): obj.life_value -= 500 # 武器的大招,一次掉血500ps=Weapon('豌豆炮',200,6,100) ##有一个武器可供选择,武器名字叫豌豆炮cabbage=Flora('bigcabbage',10,1000,6000) #创建了大白菜植物zombie=Corpse('z1','zob1',10) #创建了一个僵尸,普通僵尸##植物感觉打不死僵尸,于是升级自己的武器为豌豆炮print(cabbage.moeny,cabbage.life_value,cabbage.aggressivity)print(zombie.life_value)