python面向对象--类的刨析
编程日常::::
#编程就是程序员用特定的语法加数据结构加算法在计算机上执行过程,方式有很多种,最常用的就是面向对象编程和面向过程编程
#设计思路一开始解决一个大问题,然后把大问题分解成小问题,一步步解决小问题
#面向对象编程方式:利用类和对象创建各种模型来对真实世界的描述
#只要是一个对象,就肯定属于某种品类;只要是对象,一定有属性(也就是功能的意思)
# 类>对象>属性
#特性
class类 :一个类拥有相同属性的对象的抽象,共同的方法
object对象:一个对象即是一个类实例化的实例,一个类必须讲过实例化方可在程序中调用就像人类,每一个都是独立的对象,人与人也有相同的特性,亦有不同
#封装:在类中对数据复制
#继承:一个类可以派生出子类
#多态:“一个接口,多个实现”
#oop编程方式(面向对象)
1,重复写代码是非常不好的行为
2,写的代码要经常变更
简单来说:
面向对象在python中应用是最多的,同时也是不可缺少的,简单理解类和对象的关系,举个例子:假设人类是一个类,那么每一个个体的人就是对象,同时也有相同的特征和不同的特征
类包含对象的属性,对象是每一个类的实例化体现
概念理解的差不多,不如动手实际动手试试
实 际 操 作
要求:简化CS游戏,先创建两个人物,分别给他们不同的属性,同时也赋予他们相同的属性(比如说生命值)还有一些功能(死亡和买枪复活)
思路:首先,我们根据要求,先建立一个类,来定义人物的属性,并给这个类添加功能,最后定义两个人物变量来调用这个类
1,如图(先定一个类):
我们可以通过代码看到:Role是类,里面定义了(name,role,weapon,life_value,money)这几个人物属性,并在下面通过三个函数来完成人物功能的操作
2,如图,添加两个人物调用Role并赋值
3,那么该如何调用呢?,这里的r1和r2代表两个人物,上图虽然已经加了参数,但是执行后没有任何内容,这时候我们把#号注释去点看看效果
我们可以看到,Role类被调用,并赋予了r1人物的参数,然后实现了两个函数的功能(死亡和复活)
4,如果我们要改名如何呢?假设我们改r1人物Alex名
对类不做修改,只在最后调用时修改即可,可是问题来了,在此处将类中的name变量改变是没有问题,也就改了名字,但是如果类变量也改变呢?
5,如图,我们再给类添加一个(name = 123)的变量(简称类变量)
如果这样添加,那按第4 步我们修改r1的人名,会不会和类里的变量name冲突呢?我们来执行看一下
发现并没有冲突,类的变量虽然也是name,类中实例的变量也是name,但是在修改实例变量时并没有因为变量名相 同而冲突,这是为什么呢?很简单,因为我们在修改实例变量后调用,其实也是实例的产生,根据实例的产生过程来说,实例在创建时,先找实例本身里的属性(变量),如果没有,再去找类的变量。
6,那么如果 r1 中修改类的变量,r1 和 r2 同时打印类变量,会不会影响r2 的类变量打印呢?
如图:我们在r1中修改类变量( n ) 将 在类中 n 的值“123” 改成 “456”,并打印 r1 和 r2 的结果
我们可以看到,r1 的打印成功将n 改变, r2 也没有因为r1修改类的变量而改变,这是为什么呢?因为看似我们将类的变量做了修改,其实根本就没有将类变量做修改,只是将内存r1中的类变量做了修改,所以不会影响到其他实例。
经过以上问题的测试,我们可以利用以上方法,运用到工作中。
例如:当我们遇到多数对象调用一个类,并且类中一个或多个属性都会被对象调用,按实例化的过程来看,每一个对象实例时都会调用类中的属性来完成,这样会造成大量内存资源浪费;我们完全可以把相同的属性,写到类的变量里,不必再写到实例变量里,这样,就可以节省资源。
如图:
这里将原本在实例变量里的money 和 value 写道类变量一行(上面) ,打印r1 和r2,执行一下
: ok
类的用法还有很多,通过以上几种实践,可以清楚的认识对象在调用类时的过程。并且利用类的特性,可以对对象的不同应用,来达到优化的目的,节省资源。