上一节将到面对对象必须先抽象模型,之后直接利用模型。这一节我们来具体理解一下这句话的意思。

  面对对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,比如student类,而实例是根据类创建出来的一个个具体的‘对象’,每个对象拥有相同的方法,但各自的数据可能不同。

一.类的创建和实例化

在python中,类是通过class关键字创建的

 class Student():
pass

class后面紧接着是类名,即Student,类名通常是大写开头的单词。关键字pass起到占位符的作用。

定义好类之后可以通过类来创建实例

p1=Student()

print(Student)
print(p1)

###输出结果
#<class '__main__.Student'>
#<__main__.Student object at 0x013BD430>

Student本身是一个类。p1是Student的一个实例,0x013BD430是类的地址。创建实例是通过类名+()实现的。

创建类的时候,我们可以把类具有的属性添加进去,例如Student具有的属性name和score。

class Student():
def __init__(self,name,score):
self.name=name
self.score=score
#注意__init__是双下划线开始和结束的,这是Python中一个特殊的魔术方法,魔术方法以后会介绍

注意:__init__方法的第一个函数永远是self,它表示创建的实力本身,因此__init__方法内部就可以吧各种属性绑定到self,因为self就是实例本身。name是一般的参数,self.name=name是将name变为实例的属性。有了__init__方法,在创建实例传参的时候必须要跟__init__参数匹配,但是self不用传参,python解释器自己会将实例变量传进去。

p1=Student('方方','')

传参的原理是这样的p1=Student.__init__(p1,'方方','91')。__init__是一种特殊的方法,在实例创建的时候是自动调用的,这相当于在一个小孩儿没出生前就给小孩起名字是一样的,主要是防止以后利用这些属性的时候而没有这些属性。

我们可以查看这些属性

print(p1.name)
print(p1.score)
##输出
#方方
#

我们还可以在类中定义其他方法

class Student():
def __init__(self,name,score):
self.name=name
self.score=score
def get_name(self):
return self.name
def get_score(self):
return self.score
p1=Student('方方','')
print(p1.get_name())
print(p1.get_score())

细心观察我们会发现,类中调用的函数第一个参数是self,到用时不用传参(python解释器自己会将实例变量传进去),除此之外,类的方法和普通函数没有任何区别。

二.数据封装

  面向对象编程的一个重要特点就是数据封装。在上面的Student类中,每个实例就拥有各自的namescore这些数据。既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法:

class Student():
def __init__(self,name,score):
self.name=name
self.score=score
def get_name(self):
return self.name
def get_score(self):
return self.score
p1=Student('方方','')
print(p1.get_name())
print(p1.get_score())

我们来看一下内部结构:

这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出namescore,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。

小结:

  1.类是创建实例的模板,而实例是一个个具体的对象,各个实例拥有数据都互相独立,互不影响

  2.方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据

  3.通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节

  4.和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同

Python进阶_类与实例的更多相关文章

  1. Python进阶:函数式编程实例(附代码)

    Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...

  2. python进阶_浅谈面向对象进阶

    python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass  class F ...

  3. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  4. Python 进阶_生成器 & 生成器表达式

    目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...

  5. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  6. Python学习:类和实例

    Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...

  7. python之定义类创建实例

    https://www.cnblogs.com/evablogs/p/6688938.html 类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 1 2 >>&g ...

  8. Python学习_11_类和实例

    类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:    pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的 ...

  9. Python面向对象编程 -- 类和实例、访问限制

    面向对象编程 Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程 ...

随机推荐

  1. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  2. nignx笔记1

    上图是单版的架构,理论一个tomcat并发就200到300,经过优化后的最多500,这很明显容量低,而且出现单点故障后应用服务就不可以访问了,比如tomcat,这样明显对于多并发是不行的. 那么如果我 ...

  3. dojo中引入FusionCharts柱状图报错

    1.今天,做项目的过程中,我发现Java后台查询的数据都是正确的,并且拼接成JSON格式也正确,但是传到JSP页面时,图无法显示出来还报错,后来经过检查发现是JavaScript和引入FusionCh ...

  4. RFM模型+SOM聚类︱离群值筛选问题

        笔者寄语:一般情况下离群值不应该直接删除,应该进行筛选,然后进行专门的离群值分析.笔者在这进行一下思考,在聚类基础之上的一种离群点检验. 基于聚类的离群点检测的步骤如下:数据标准化--聚类-- ...

  5. VxWorks 引导程序

    前言:vxworks 的一些文件,如 usrconfig.c 在 config,comp目录中均有出现,因编译方式而选择某一个文件,命令行方式采用 config 目录文件,tornado 图形界面配置 ...

  6. JavaScript利用append添加元素报错

    1.错误描述 在IE浏览器上: Uncaught HierarchyRequestError:Failed to excute 'appendChild' on 'Node':The new chil ...

  7. 如何在BIOS中设置RAID?

    随着价格的下降和相应主板的支持,目前SATA硬盘已经逐渐成为主流.但由于受芯片组和操作系统的影响,不少用户对SATA硬盘的使用及安装系统掌握不足,今天小编就给大家介绍一下SATA硬盘的日常应用技巧,希 ...

  8. CSS开启硬件加速提高网站性能

    国外一篇文章,有点意思,转载过来,准备尝试下~ 中文地址:http://www.cnblogs.com/yzw7489757/ 原文地址:http://blog.teamtreehouse.com/i ...

  9. PC响应式、固宽布局思想

    截止目前,国内绝大多数内容为主的网站(知乎,果壳,V2EX,网易新闻等)均使用内容区定宽布局,大多数电商网站(网易考拉,京东,聚美优品)也使用了内容区定宽的布局,也有些网站使用了自适应布局. 如果不明 ...

  10. EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)

    前言 EntityFramework Core 2.0引入了显式编译查询,在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应.显式编译查询提供了高可用场景,通过使用显式编译的查询可以提高查 ...