当前位置: 首页 > news >正文

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例

  • 一、设计类需满足的三要素
    • 1. 类名
    • 2. 属性和方法
  • 二、以植物大战僵尸的为例的类的设计
    • 1. 尝试分类
    • 2. 创建对象调用类的属性和方法*【代码二】*
    • 3. 僵尸的继承
  • 三、代码实现

一、设计类需满足的三要素

1. 类名

  • 类名:某类事物的名称,一般按照驼峰命名法起名。

比如说描述学校内的人,可以分类为Teacher类,Student类等。

class Teacher#定义了一个教师类
class Student#定义了一个学生类

这一步,需要解决的事对你所要处理的范畴进行分类。

2. 属性和方法

  • 类的主体主要由属性和方法构成。就相当于一个事物(名词)可以拥有不同的属性(可以用名词或形容词来描绘它)。
  • 方法:这类事物具有什么样的行为(动词)。

以学生类为例:

class Student: #创建学生类clothes= "校服"               # 设置学生需要穿校服属性属于【类属性】def __init__(self,name,age): # 类的构造函数,用于初始化类的内部状态,为类的属性设置默认值self.name=name           # 定义name属性self.age=age             # 定义age属性,属于【对象属性】def Learn(self):             # 定义一个函数,为类的函数,称为方法;它至少有一个参数self# 创建Learn方法print(f"{self.age}岁的{self.name},要穿{self.clothes},正是喜欢学习的年纪!")Tom=Student("Tom",13) # Tom是Student类的对象,就是一个具体的学生。# 在这个过程中,赋予类的Tom对象对应的属性name为Tom,age为13。
Tom.Learn()          # Tom作为学生类的对象调用了学生类的Learn方法。

程序运行结果:
在这里插入图片描述

二、以植物大战僵尸的为例的类的设计

1. 尝试分类

请添加图片描述
明显,植物大战僵尸作为对抗类游戏,可以分为两个大类别。植物类和僵尸类(随着后续场景的元素加入,可能还会有场景类等,这些是可以逐渐完善的)
其实在最开始设计的时候,我只分了一个类别,因为我发现这六项事物都有名字和生命值这两个属性,是完全可以分成一个类的,但是在后续的设计中发现,虽然攻击性植物和僵尸都有攻击属性,但是它们的攻击动作(即方法)是不同。所以类别的区分是需要有度的。

对于图片中已经提供的这六个对象,可以分为两个大类,Plant类和Zombie类。并依次找这六个事物的共同特征技能,分别设置为对应的属性方法
在这里插入图片描述

根据表格,我选择将共有特征设为该类的属性,特殊技能设为该类的方法,方法是定义在类中的函数,这个在定义函数时设置对应的参数,后期具体的对象调用类的方法时,将实参传递到方法的形参中。

  • 定义Plant类,即植物的属性与方法*【代码一】*:
class Plant():def __init__(self,name,shengming):self.name=nameself.shengming=shengming#植物属性介绍print("{}的生命值是{}".format(self.name, self.shengming))def Create_sun(self,Create_sun,shake):self.Create_sun=Create_sunself.shake=shakeprint("{}的每分钟生产阳光是{},它会自己晃,速度为{}".format(self.name, self.Create_sun,self.shake))def shoot(self,color,velocity,kind):self.color=colorself.velocity=velocityself.kind=kindprint("{}的颜色是{},发射子弹速度为{},子弹头为{}".format(self.name, self.color, self.velocity,self.kind))

其中,

def Creat_sun(self,Creat_sun,shake):self.Creat_sun=Creat_sunself.shake=shake

表示的是创建了一个Plant类的Create_sun 生产阳光方式,该方式中有两个参数需要通过形式参数来传递具体的数值,如形式参数Create_sun,在后期具体赋值来传递该植物生产阳光的多少,后期不止是向日葵,多头向日葵也可以继承这个方法。

2. 创建对象调用类的属性和方法*【代码二】*

p1=Plant("向日葵",50) # 调用类的属性,形式参数与具体数值的位置一一对应
p1.Create_sun(50,6)  #调用类的方法,形式参数与具体数值的位置一一对应
print(" ") #单纯为了美观,打个空格p2=Plant("寒冰射手",200)
p2.shoot("blue","75","刺客坚冰")
print(" ")

此处设置了一个具体的对象p1和p2,对应的具体植物就是向日葵和寒冰射手。
【代码一】和【代码二】合起来运行结果如下:
在这里插入图片描述

3. 僵尸的继承

  • 定义Zombie类,即僵尸的属性与方法:
class Zombie():attack = "咬"move = "移动"def __init__(self,name,shengming):self.name=nameself.shengming=shengmingprint("{}的生命值是{},它有{}和{}的属性".format(self.name, self.shengming,self.attack,self.move))

设置一个具体的僵尸对象,调用这个属性给大家看看:

z1=Zombie("铁桶僵尸",1000)

运行结果:
在这里插入图片描述
因为,“咬”和“移动”是所有僵尸的属性,且跟name不同(每个植物僵尸都有名字,但名字是不一样的),所以这就是最开始所说的类属性,name放在__init__()函数内,属于对象属性。

其他的方法的建立就与植物的非常类似,在此处不赘述。后面有完整代码。
这里说说继承。我在完成跳跃僵尸的打印时,运用的类的继承。跳跃僵尸作为僵尸类的子类,可以继承Zombie的name,shengming,move,attack属性,同时在jumpZombie子类中添加新的jump方法,实现调用。

代码如下:

class jumpZombie(Zombie):  #这个jumpZombie子类的括号里放入类父类Zombie的名字def jump(self,jump):self.jump = jumpprint( "我是{},我能跳{}丈高".format(self.name,self.jump))Z2=jumpZombie("跳跃僵尸",1500)
Z2.own_weapon("竹竿")
Z2.other_attack("jump")
Z2.jump(8)

三、代码实现

总体的代码实现:

class Plant():def __init__(self,name,shengming):self.name=nameself.shengming=shengming#植物属性介绍print("{}的生命值是{}".format(self.name, self.shengming))def Create_sun(self,Create_sun,shake):self.Create_sun=Create_sunself.shake=shakeprint("{}的每分钟生产阳光是{},它会自己晃,速度为{}".format(self.name, self.Create_sun,self.shake))def shoot(self,color,velocity,kind):self.color=colorself.velocity=velocityself.kind=kindprint("{}的颜色是{},发射子弹速度为{},子弹头为{}".format(self.name, self.color, self.velocity,self.kind))class Zombie():attack = "咬"move = "移动"def __init__(self,name,shengming):self.name=nameself.shengming=shengmingprint("{}的生命值是{},它有{}和{}的属性".format(self.name, self.shengming,self.attack,self.move))def own_weapon(self,weapon):self.weapon= weaponprint("{}的武器是{}".format(self.name, self.weapon))def other_attack(self,other_attack):self.other_attack=other_attackprint("它的其他攻击方式为{}".format(self.other_attack))p1=Plant("向日葵",50)
p1.Create_sun(50,6)
print(" ")p2=Plant("寒冰射手",200)
p2.shoot("blue","75","刺客坚冰")
print(" ")z1=Zombie("铁桶僵尸",1000)
z1.own_weapon("铁桶")
print(" ")#跳跃僵尸要开始继承啦
class jumpZombie(Zombie):  #这个jumpZombie子类的括号里放入类父类Zombie的名字def jump(self,jump):self.jump = jumpprint( "我是{},我能跳{}丈高".format(self.name,self.jump))Z2=jumpZombie("跳跃僵尸",1500)
Z2.own_weapon("竹竿")
Z2.other_attack("jump")
Z2.jump(8)

运行结果为:
在这里插入图片描述
that’s all!

相关文章:

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例 一、设计类需满足的三要素1. 类名2. 属性和方法 二、以植物大战僵尸的为例的类的设计1. 尝试分类2. 创建对象调用类的属性和方法*【代码二】*3. 僵尸的继承 三、代码实现 一、设计类需满足的三要素 1. 类名 类名:某类事物的名…...

python中权重剪枝,低秩分解,量化技术 代码

目录 python中权重剪枝,低秩分解,量化技术 代码 权重剪枝 低秩分解 scipy 量化技术 python中权重剪枝,低秩分解,量化技术 代码 权重剪枝 权重剪枝可以通过PyTorch的torch.nn.utils.prune模块实现。以下是一个简单的例子: import torch import torch.nn as nn impor…...

调用matlab用户自定义的function函数时,有多个输出变量只输出第一个变量

很多朋友在使用matlab时,会使用或自己编辑多个function函数,来满足自己对任务处理的要求,但是在调用function函数时,会出现这个问题:调用matlab用户自定义的function函数时,有多个输出变量只输出第一个变量…...

RabbitMQ七种工作模式之简单模式, 工作队列模式, 发布订阅模式, 路由模式, 通配符模式

文章目录 一. Simple(简单模式)公共代码:生产者:消费者: 二. Work Queue(工作队列模式)公共代码:生产者:消费者1, 消费者2(代码相同): 三. Publish/Subscribe(发布/订阅模式)公共代码:生产者:消费者: 四. Routing(路由模式)公共代码:消费者: 五. Topics(通配符模式)公共代码:生…...

Win10安装kafka并用C#调用

kafka安装 jdk、kafka版本如下,zookeeper使用kafka自带版本 安装包下载位置:https://download.csdn.net/download/henreash/90087368 (赚点csdn下载资源分) 安装jdk后,解压kafka压缩包,修改配置文件: kafka_2.13-3.9.0\config\…...

高级架构二 Git基础到高级

一 Git仓库的基本概念和流程 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何…...

深入解析二叉树算法

引言 二叉树(Binary Tree)作为数据结构中的一种重要形式,在计算机科学的诸多领域中得到了广泛应用。从文件系统到表达式解析,再到搜索和排序,二叉树都扮演着关键角色。本文将从二叉树的基础概念出发,详细探讨其各种算法及其应用,并提供相关代码示例,旨在为读者建立扎实…...

如何解决maven项目使用Ctrl + /添加注释时的顶格问题

一、问题描述 相信后端开发的程序员一定很熟悉IDEA编译器和Maven脚手架,使用IDEA新建一个Maven工程,通过SpringBoot快速构建Spring项目。在Spring项目pom.xml文件中想添加注释,快捷键Ctrl /,但是总是顶格书写。 想保证缩进统一…...

总结的一些MySql面试题

目录 一:基础篇 二:索引原理和SQL优化 三:事务原理 四:缓存策略 一:基础篇 1:定义:按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的…...

渤海证券基于互联网环境的漏洞主动防护方案探索与实践

来源:中国金融电脑 作者:渤海证券股份有限公司信息技术总部 刘洋 伴随互联网业务的蓬勃发展,证券行业成为黑客进行网络攻击的重要目标之一,网络攻击的形式也变得愈发多样且复杂。网络攻击如同悬于行业之上的达摩克利斯之剑&…...

用Go语言重写Linux系统命令 -- nc简化版

用Go语言重写Linux系统命令 – nc简化版 1. 引言 netcat,简称 nc,被誉为网络工具中的“瑞士军刀”,是网络调试与分析的利器。它的功能十分强大,然而平时我们经常使用的就是他的连通性测试功能,但是nc是被设计用来测试…...

面试复盘 part 02·1202-1207 日

作品集讲述部分 分析反思 作品集讲述部分,视觉讲述部分需要更换,需要换成其他视觉相关的修改 具体话术 这是一个信息展示优化方案,用户为财务,信息区分度不足,理解成本较高,因此选择需要降低理解成本。…...

Linux评估网络性能

网络性能直接影响应用程序对外提供服务的稳定性和可靠性 ping命令检测网络的连通性 如果网络反应缓慢,或连接中断,可以用ping来测试网络的连通情况 time值(单位为毫秒)显示了两台主机之间的网络延时情况。如果此值很大,则表示网络的延时很大…...

实战ansible-playbook(四) -文件操作重定向/追加

原始命令: ----------阶段1--------------- apt-get update -y apt install nano vim iputils-ping net-tools dialog gcc apt-utils make -y systemctl stop unattended-upgradessystemctl disable unattended-upgradesecho APT::Periodic::Update-Package-Lists "1&qu…...

简单题:1.两数之和

题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 要求: 可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素…...

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法: 解决写法: // 喜欢组合语法的自己组 const io new ioServer.S…...

23种设计模式之解释器模式

目录 1. 简介2. 代码2.1 Expression (抽象表达式类)2.2 TerminalExpression (终结符表达式类)2.3 OrExpression (非终结符表达式类)2.4 AndExpression (非终结符表达式类)2.5 Test &…...

Postgresql内核源码分析-表数据膨胀是怎么回事

专栏内容:postgresql内核源码分析个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 表数据膨胀的由来 什么时候产生膨胀 首先是update 还有delete 如何消…...

github使用SSH进行克隆仓库

SSH 密钥拉取git 查询密钥是否存在 s -al ~/.ssh这个文件夹下 known_hosts 就是存在的密钥文件 创建密钥文件 ssh-keygen -t rsa -b 4096 -C "testtt.com"-t rsa 是 rsa 算法加密 -b 是指定密钥的长度(以位为单位)。 -C 是用于给密钥添加注…...

【Linux系统】 Linux内核与UNIX设计哲学的结合

Linux 内核虽然不是 UNIX 的直接衍生物,但它深受 UNIX 设计哲学的影响。Linux 的开发者,尤其是 Linus Torvalds,在设计和实现 Linux 时,借鉴了 UNIX 的核心思想,使 Linux 成为一个类 UNIX 系统。 以下从 UNIX 设计哲学…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM&#xff09…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...