python基础之面向对象01
什么是面向对象?
所谓面向对象就是将那些具有共同特质的事物组成一个类(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的更多相关文章
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- Python基础7 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...
- python基础之面向对象1
一.面向对象VS面向过程 1.面向过程 2.面向对象 二.类与对象 1.类和对象 (1)基本概念 类和对象的内存图如下: 2.实例成员 (1)实例变量 (2)实例方法: 3.类成员: (1)类变量 ( ...
- Python基础之面向对象编程
面向对象编程 —— Object Oriented Programming 简写 OOP 01. 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面向过程 和 面向对象,是两种不同的 编程 ...
随机推荐
- PSP Daily软件beta版本——基于spec评论
题目要求: 每个小组评论其他小组beta发布作品的软件功能说明书. 试用(并截图)所有其他小组的beta作品,与软件功能说明书对比,评论beta作品对软件功能说明书的实现. 根据软件功能说明书,测试所 ...
- PSP总结报告1
回答作业问题 1.回想一下你曾经对计算机专业的畅想 我高考后报考的是计算机科学与技术,当时对计算机技术基本了解为零,当时以为什么东西都会用到计算机,学计算机以后不会找不到工作,刚开学的时候对计算机一窍 ...
- 互评Beta版本(Hello World!——SkyHunter)
1 基于NABCD评论作品,及改进建议 SkyHunter这款游戏我很喜欢,小时候总玩飞机类的游戏,这款游戏我上课的时候试玩了,在我电脑上运行是很好玩的,音乐震撼,画面玄幻,富有金属音乐的味道,游戏内 ...
- No.1011_第八次团队会议
罗老师和Bigman助教: 一直以来没看博客页面,我们的博客负责人不是没写博客,而是不小心把博客发到草稿上了.. 请您再次看一下我们的博客,并批评指正! 今天大家的情绪依旧很低落,离第一轮迭代完成距离 ...
- 实验3 --俄罗斯方块 with 20135335郝爽
一. 实验内容 (一)敏捷开发与XP 内容:1.敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 2.极限编程(eXtreme Programming,X ...
- 1001.A+B Format (20)的感受
这是提交到Github的object-oriented文件夹里面的代码:https://github.com/sonnypp/object-oriented/tree/master/1001. 一.解 ...
- dazhewang数据库初设计
mysql> use dazhe; Database changed mysql> create table shops(id int primary key auto_increment ...
- 基于GUI的小学生四则运算系统
前言:首先在此感谢我的结对搭档,没有她的帮助和引导绝不会有现在的项目.很高兴和她一起结对完成这个项目.搭档真的是棒棒哒! 一.Coding.Net项目地址: https://git.coding.ne ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (一) 配置与测试
引脚连接说明 与树莓派的连线 NRF24L01 => 树莓派 GND => GND VCC => 3.3V CE = ...
- ABP ModuleZero 添加角色_创建角色是报错的问题解决方案
ABP升级后,大概3.6.1以后,在.net framework里面,从官方下载的Module zero模板添加角色是出现下面错误. 这个问题,算是新版apb的一点小缺憾,好像在.net core的模 ...