什么是面向对象?

  所谓面向对象就是将那些具有共同特质的事物组成一个类(Class),在类中为这些特质定义一个个方法(函数)。

  具体一点,比如说英雄联盟。在英雄联盟中我们可以把所有的英雄划分为一个英雄类,这个类包含血量/蓝量/攻击力/法术强度/移动速度……的基本属性,同时我们为这些英雄定义了买装备,前后左右移动,受到伤害掉血,释放技能……的功能或者方法,这些基本属性和功能就组成了一个较为完整的类。

  实际上,类就像一个模版,当我们根据这个英雄类创建英雄盖伦时,就需要将模版中的某些数值变更一下(比如说盖伦是不需要蓝的),就初步形成了盖伦的雏形。这个'英雄盖伦'就是基于'英雄类'的一个'实例(Instance)'。通过这个实实在在的盖伦,我们就可以实现类中所定义的方法了,比如说买装备等等。

例子:

class Hero(object):
hp=100

def move(self):
print('move!!')
def attack(self):
print('attack')
garen=Hero()
garen.move() #结果
move!!

如何定义类?

  在上面的例子就是定义类的方式。

  在python中,定义类是通过class关键字

class class_name(object):
pass

  class后紧跟类的名称,类名通常使用大写字母开头,后面紧跟(object)。括号中的object表明了该类继承于哪个类(类事可以继承的)。一般所有的类都继承于object。就像Linux中的init进程,他是所有进程的父进程。而object是所有类的父类。

  定义完了类,就可以根据类创建一个实例。

instance_name=class_name()

--让类接收参数:

  我们所定义的类并没有接收参数,而实际中,很多类都是可以接收参数的。

class hero(object):
hp=100 #血量暂时设定为100
def __init__(self,mp): #mp即蓝量
self.mp=mp
def move(self):
print('%s move!!'%self)
def attack(self):
print('attack')
def print_mp(self):
print(self.mp)
garen=hero(None)

上面代码中有一个__init__函数,当我们garen=hero(None)时,就是引用了这个函数。__init__函数中的参数第一个必须是self(在类中创建的函数第一个参数必须是self),这个self表示实例本身,self表示实例本身,self表示实例本身!!!

class hero(object):
hp=100
def __init__(self,mp):
self.mp=mp
print(self)
garen=hero(None)
<__main__.hero object at 0x0337F610>

既然知道self表示实例本身,那么上例中的self就表示garen,self是不需要传值的,garen=hero(None)中的None传给了mp。而self.mp=mp则是将mp绑定到实例自身。

类就是许多特殊函数的集合,这个特殊指的是:

1每个函数的第一个参数为self,并且self不需要传值。

2每个函数只能被属于此类的实例调用,这也是面向对象的一个特色:数据封装。

除此之外类中的函数与正常函数没有差别。另外我们一般称类中的函数为类的方法

--下面我们来看一看类与实例的内存分配。

class hero(object):
hp=100
def __init__(self,mp):
self.mp=mp
def move(self):
print('move!!')
def attack(self):
print('attack')
def print_mp(self):
print("his mp is %s "%(self.mp)) garen=hero(None)
ahri=hero(100)
print(id(garen.mp))
print(id(ahri.mp))
#结果两个址不同
1466583752
1466755488

所传参数在内存中的地址

class hero(object):
hp=100
def __init__(self,mp):
self.mp=mp
def move(self):
print('move!!')
def attack(self):
print('attack')
def print_mp(self):
print("his mp is %s "%(self.mp)) garen=hero(None)
ahri=hero(100)
print(id(garen.print_mp))
print(id(ahri.print_mp))
#结果两个地址是相同的
12027904
12027904

方法在内存中的地址

就如下图所示:

类的方法,变量都保存在自己这段内存中。而实例仅仅保存了自己的变量以及参数,实例并没有将方法复制到自己的内存地址中。

--访问限制

class hero(object):
hp=100
def __init__(self,mp):
self.mp=mp
def move(self):
print('move!!')
def attack(self):
print('attack')
def print_mp(self):
print("his mp is %s "%(self.mp))
def set_mp(self,new_mp):
self.mp=new_mp
garen=hero(None)
ahri=hero(100)

在上例中,我们可以通过调用类的set_mp方法修改当前英雄的mp值。

ahri.set_mp(77)
print(ahri.mp)
77

但我们也可以直接使用ahri.mp=77来修改,如何能限制这种在外部对实例进行修改的方式呢?

如果要实例内部变量不被外部访问,我们可以在变量前加上两个下划线‘__’

class hero(object):
hp=100
def __init__(self,mp):
self.__mp=mp
def print_mp(self):
print("his mp is %s "%(self.__mp))
def set_mp(self,new_mp):
self.__mp=new_mp
garen=hero(None)
ahri=hero(100)
print(ahri.__mp)
#结果
AttributeError: 'hero' object has no attribute '__mp

这时,当我们想要对某个英雄的mp值进行修改时,只能调用hreo的set_mp方法进行修改。

这样做的好处:

  1 确保了外部代码不能随意修改对象内部的状态。代码更健壮

  2 我们可以在set_mp方法中对所输入的new_mp值的合法性进行判断,毕竟不能让mp值为负啊

python基础之面向对象01的更多相关文章

  1. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  2. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  3. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  4. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  5. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  6. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  7. Python基础7 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

  8. python基础之面向对象1

    一.面向对象VS面向过程 1.面向过程 2.面向对象 二.类与对象 1.类和对象 (1)基本概念 类和对象的内存图如下: 2.实例成员 (1)实例变量 (2)实例方法: 3.类成员: (1)类变量 ( ...

  9. Python基础之面向对象编程

    面向对象编程 —— Object Oriented Programming 简写 OOP 01. 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面向过程 和 面向对象,是两种不同的 编程 ...

随机推荐

  1. bootstrap中的data-toggle模态框相关

    一,点击即打开1,点击按钮 <a href="javascript:void(0)" class="btn btn-primary" data-toggl ...

  2. Bing词典vs有道词典比对测试报告

    功能篇 核心功能测评:http://www.cnblogs.com/C705/p/4075554.html 细节与用户体验:http://www.cnblogs.com/C705/p/4077112. ...

  3. Daily Scrum (2015/11/8)

    由于编译大作业临近deadline以及各项选修课即将结课,虽然PM强调软工任务也很紧迫,但是大多数成员表示今天想请假一天.符美潇今天把自己所负责的数据库编码部分和谢金洛的UI进行了对接.在测试过程中发 ...

  4. 【CSAPP笔记】13. 链接

    下面就要进入本书的第二部分--在系统上运行程序.书的第一部分,主要是研究单个应用程序,关注的是数据类型.机器指令.程序性能.存储器系统等话题.在书的第二部分,我们继续对计算机系统的探索.现代操作系统与 ...

  5. Alpha版本冲刺(七)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  6. TCP连接 三次握手 四次挥手

    前言: TCP协议是面向连接.安全可靠.基于字节流的传输层协议,在进行http协议访问时就用到了tcp连接.在建立TCP连接时需要经历三次握手,断开连接时需要经历四次挥手.在此进行记录. 内容: TC ...

  7. 基于Freemarker的eclipse plugin代码生成器插件开发

    固定类型的软件写多了,里面总是有一些复制粘贴改变类名改变量的基础文件,相似程度非常高.作为一名程序员,坚持不多写一行重复代码的精神,写了一个Eclipse的代码生成器插件.插件通过在xml文件中配置的 ...

  8. php $_SERVER['HTTP_USER_AGENT']

    //获取浏览器 function getBrowse() { global $_SERVER; $Agent = $_SERVER['HTTP_USER_AGENT']; $browseinfo='' ...

  9. PHP 内置函数strlen 和mbstring扩展函数mb_strlen的区别

    #EXAMPLE $str_uncode = "简体中文Chinese(Simplified)"; //统计字符串长度 echo strlen($str_uncode).'< ...

  10. userData Behavior

    https://msdn.microsoft.com/zh-cn/vstudio/ms531424 userData Behavior This topic documents a feature o ...