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. 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面向过程 和 面向对象,是两种不同的 编程 ...
随机推荐
- eclipse在线安装maven插件
http://blog.csdn.net/xiaoxiaoyeyaya/article/details/17200987 在安装插件的时候将下面的contact all update sites du ...
- js给节点添加或删除类名
为 <div> 元素添加 class: document.getElementById(“myDIV”).classList.add(“mystyle”); 为 <div> 元 ...
- struts2 中怎样获取HttpServletReqest
struts2 中怎样获取HttpServletRequest 和HttpServletResponse 提供两种方法 第一种通过调用ServletActionContext这个类源代码中提供这个对象 ...
- DataTime日期格式化
C# DateTime日期格式化 在C#中DateTime是一个包含日期.时间的类型,此类型通过ToString()转换为字符串时,可根据传入给Tostring()的参数转换为多种字符串格式. 目录 ...
- Codeforces Round #157 (Div. 1) B. Little Elephant and Elections 数位dp+搜索
题目链接: http://codeforces.com/problemset/problem/258/B B. Little Elephant and Elections time limit per ...
- Software Defined Networking(Week 3, part 1)
Control and Data Plane Seperation 课程地址 Overview 今天正式地学习一个控制与数据平面分离.学习完本节,应该要掌握何为控制和数据平面,了解它们的功能以及好处, ...
- Week2-作业一——《构建之法》三章精读之想
Week2-作业一——精读<构建之法> 前言 其实我本人是不经常看书的,电子书倒是看了不少,实体书真的不经常看,但是为了这次作业的需求,我还是选择静下心来阅读一下这本<构建之法> ...
- ABP ModuleZero后台框架materialize禁止模拟select和checkbox
使用abp modulezero自带那个后台框架发现一个操蛋的问题,所有的select和checkbox都被改成div模拟的,虽然比原生美观,但有时候真的很难用. 比如说要用select做一个联动菜单 ...
- IT行业的个人见解
IT这个行业是近代历史上的新新行业,它的就业前景是非常的好的,就业率高,但是这个行业的需求人才精英不是那些半桶水的所谓IT男.我现在学习的是计算机专业中的软件工程目标是成为一名合格的软件工程师,软件工 ...
- 动态语句SQL语句写法
/*************************************************************************************************** ...