以魔兽世界为引言,探讨一下python里的类

Python学到类这里就是达到了第一个瓶颈,因为此时程序思考和阅读的路线就不再直观,而是要拐一个弯弯。当突破了这一段就会达到了一个新的高度,但是“类”主要还是应用于多对象的建立,在大程序中为了省事,往往需要“类”的概念。小程序、小脚本可以不使用。

“类”相当于一个“模型”,有了“模型”/“图纸”,才能实例化把抽象的东西成为具体。所以说“类”里的东西要有共性,以著名网游魔兽世界为例,在WOW里的NPC主要分为以下几种:“亡灵(受到神圣攻击伤害大)”、“人类(临死的时候会惊恐的逃跑求助”,“元素(可以被放逐)”,“野兽(可以被驯服恐吓)”等等,这样多种的设定使得面对不同的怪,就可以采用不同针对的方法会有事半功倍的效果。而游戏开发者在编写代码的时候,就可以单独把“人类”做成一个类,下面笔者中英文结合,讲述这个过程,请诸位领会其精神:

class 人类:

def 属性1:

“生命值为0的时候会死亡”

def 属性2:

“可以被魅惑”

def 属性3:

“生命值下降到20%的时候会逃跑求助”

def 属性4:

“基本移动距离为1像素/秒,跑步距离为2像素/秒”

def 属性5:

“跳舞的姿势/大笑的姿势/惊恐的姿势/跑火车的姿势....”

def 属性6:

“死亡的姿势/跑步的姿势/拿弓箭的姿势/拿长柄武器的姿势/拿双手武器的姿势”

等等等等,就不一一列举了。

以上这些是作为“人类”这个NPC类的同性,至于在不同的NPC中就由他们自己的细化属性进行细化。比如“血色十字军”,就有他们自己的细化属性,思路过程如下:

血色十字军=人类()       #血色十字军是属于“人类”这个类的#

血色十字军.对玩家态度=仇恨  #这是可以击杀的#

血色十字军.生命值=XXX    #游戏里即使是同一个等级的每一个怪物也血量不同,应该是使用了random模块,然后选择一个范围,从中任意取值#

血色十字军.喊话=“台词”   #遭到攻击/发现敌人的时候会喊自己独特的台词#

通过这些细节的细化,使“血色十字军”这种NPC得到了进一步的丰满。同时由于怪物也分为战士,圣骑士,牧师等职业,那么还需要再设定“战士”的类,“圣骑士”的类,“牧师”的类,通过“父类--子类”的继承特性,进一步的将怪物丰满到位。

其他的怪物,比如“石像鬼”和“食尸鬼”都属于“亡灵类”,但是“石像鬼”可以有自己的细化属性,比如“空中远距离攻击+移动的像素更大”,而“食尸鬼”的细化属性是“普通的近距离抓击”等等。

==================================分割线=========================================

以上仅仅是用一个身边的例子来讲述一下“类”的浅显用处,帮助各位理解。下面将探讨一个程序,从这个程序中的输出结果里找到一些“类”的特性。

class C:

def __init__(self,size=10):

self.size = size

def getSize(self):

return self.size

def setSize(self,value):

self.size = value

def delSize(self):

del self.size

x = property(getSize,setSize,delSize)

全部程序在此,先使用c1=C(),来将这个“图纸”实例化。

>>>c1.getSize()

输出结果为10,因为c1已经默认启动了__init__这个函数,size=10这个变量已经进入c1中,由于self的特性,在c1中,生成了c1.size = size =10,故c1.getSize()可以直接return。

__init__函数是类函数里上来就默认执行的函数,对于本例函数而言,他的操作步骤是这样的:

                  |------>getSize()

    函数启动----->__init___ |------>setSize()

                 |------>delSize()

    且不要当成普通函数步骤从上往下的看,而是要“主线--分支”的看。

>>>c1.x

输出结果为10,这是因为property语句的特性---“以变量规定定义好的变量”,property后面三项有一项有值,就可以返回给x这个属性,然后被c1拿来。注意,这个没有输入上面的c1.getSize(),直接c1.x也是会返回10的,因为已经执行了__init__。

>>>c1.x=18

>>>c1.x

输出结果为18,这个没什么好说的,因为手动已经将c1里的x属性设定为18,自然就会返回18。

>>>c1.getSize()

此时的输出结果不再是10,而是18。这是由结果往前推。

>>>c1.setSize(5)

>>>c1.x

此时的输出结果为5,这又是从手动设定的值往结果推。可见属性在“类”里是可以从前到后的变,也可以从后到前的变。注意,type(c1.setSize(5))的结果是<class ‘NoneType‘>。

>>>c1.getSize(5)

此时的输出还是5。印证了刚才的想法,属性的值可以来回的改。

在实际工作中,可以一个一个改前面的项,这样得到一个更改后的x值,也可以通过直接改x的值,一步到位的更改了前面的所有项,而后者是大程序应用里更加简单的方法。

时间: 2024-10-06 14:09:23

以魔兽世界为引言,探讨一下python里的类的相关文章

python里的类与一切事物都是对象

对于python,一切事物都是对象,对象基于类创建 列如 name='csdcs' li=[1,3,43] 上面两个都是对象,因为它们都是python中的 类里面存着许多的功能,功能的集合,     对象里存着具体输入的值,与类的内存地址 当对象要进行操作实现不同的功能时,它就会根据保存的内存地址去寻找类引用里面的功能 这样,避免了,功能相同的对象里面,每个对象都去保存相同的功能,它们功能相同都直接去引用类里的功能就行了,类里面就保存了它们的功能 所以对象都是基于类创建的 列如: ll=[11,

在python里如何动态添加类的动态属性呢?

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

python里的splitlines详解

Python的split方法函数可以分割字符串成列表,默认是以空格作为分隔符sep来分割字符串. In [1]: s = "www jeapedu com" In [2]: print s.split() ['www', 'jeapedu', 'com'] 当然可以改变sep分割字符串为其他字符串. In [6]: t = "www.jeapedu.com" In [7]: print t.split(".") ['www', 'jeapedu'

python里多线程的写法

python里多线程的写法 今天用到python多线程的时候, 发现不知道如何正确的等待所有线程结束后再结束主线程. 其实到最后我才知道这都是杞人忧天, Thread()出来的实例本来就是等到主进程结束后才结束. 官方解释: daemon A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called

python里的拆包、引用、递归与匿名函数

拆包:*A拆元组,**B拆字典. 引用:在C.C++里面里面a=1,b=a,实际上相当于硬链接,相当于两份a.b各有一个1,多占一个空间,而在python里就是软连接,只有一份,通过id(a)来查看id都一样, 在python里定义的东西如一直没引用,那么就会成为垃圾,不用担心,python有自己的机制去除垃圾. 不可变类型:数字.字符串.元组. 可变类型:列表.字典,它们都不能做字典的key. 递归:一个函数里调用了这个函数自己,递归完成阶乘,3的阶乘=3*(2的阶乘) 递归时一定要想到何时要

python里三种等待元素的方法

在做web或app的自动化测试经过会出现找不到元素而报错的情况,很多时候是因为元素 还没有被加载出来,查找的代码就已经被执行了,自然就找不到元素了.那么我可以用等待 元素加载完成后再执行查找元素的code. Python里有三种等待的方式:一. 强制等待 Sleep(54) 这个方法在time模块,使用时通过from time import sleep导入比如: Sleep(10) #表示强行等待10s再执行下一句代码 Driver.find_element_by_xpath("xxxxxx&q

&lt;转载&gt; 为什么在Python里推荐使用多进程而不是多线程?

最近在看Python的多线程,经常我们会听到老手说:"Python下多线程是鸡肋,推荐使用多进程!",但是为什么这么说呢?                要知其然,更要知其所以然.所以有了下面的深入研究: 首先强调背景:        1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定.        2.每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是

二进制转换、字符编码的演化、Python里使用的编码、浮点数、浮点数的精确度问题

二进制转换 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 古时候敌人来了,如何通信呢? ①派人跑着去通知,速度太慢,等人回来,仗也打完了.

python里字典的用法介绍

一.什么是字典 字典是python里的一种数据类型,特点是元素的无序性,和键key的唯一性.字典的创建方法是{key:values},字典里的键key只能是不可变的数据类型(整型,字符串或者是元组),值values可以是任何数据类型.字典里的一组key:values叫做一个键值对item. 二.字典的基本操作 首先我们创建一个字典: a={'name':'tom','age':18,'sex':'male','height':'175cm'} b={'one':111,'name':'lisa'