Python进阶_类与实例
上一节将到面对对象必须先抽象模型,之后直接利用模型。这一节我们来具体理解一下这句话的意思。
面对对象最重要的概念就是类(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类中,每个实例就拥有各自的name和score这些数据。既然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类,就只需要知道,创建实例需要给出name和score,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。
小结:
1.类是创建实例的模板,而实例是一个个具体的对象,各个实例拥有数据都互相独立,互不影响
2.方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据
3.通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节
4.和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同
Python进阶_类与实例的更多相关文章
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- python进阶_浅谈面向对象进阶
python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class F ...
- python学习_数据处理编程实例(二)
在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...
- Python 进阶_生成器 & 生成器表达式
目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...
- python中的类和实例
今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...
- Python学习:类和实例
Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...
- python之定义类创建实例
https://www.cnblogs.com/evablogs/p/6688938.html 类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 1 2 >>&g ...
- Python学习_11_类和实例
类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass: pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的 ...
- Python面向对象编程 -- 类和实例、访问限制
面向对象编程 Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程 ...
随机推荐
- Py4j-RPC
python 使用灵活.方便在科研中被广泛的使用,Numpy和SciPy等科学计算库使其拥有强大的计算方式.很多机器学习和深度学习的库也都采用了python,然而在大数据.后台开发中仍然较多的使用Ja ...
- mysql varchar vs oracle varchar2
1.错误提示: mysql的Data truncation: Data too long for column 'path' at row 1 错误原因: 1.字段过长而导致出错的, 2. 可能是因为 ...
- 我的Java设计模式-观察者模式
相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...
- Angularjs的真分页,服务端分页,后台分页的解决方案
背景:项目的框架使用的是Angularjs,在做数据展示的时候,使用的是ng-table.用过ng-table的人都知道,他是自带分页的,默认分页方式是假分页.也就是一口气把所有的数据从数据库里取出来 ...
- PCI和PCIE插槽有什么区别?
PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽.PCI插槽也是主板带有最 ...
- Linux显示历史记录
Linux显示历史记录 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ history 1 uname -a 2 lsusb 3 df -h 4 ps -A 5 ...
- HTML5之Canvas画正方形
HTML5之Canvas画正方形 1.设计源码 <!DOCTYPE html> <head> <meta charset="utf-8" /> ...
- nested exception is java.sql.SQLException: IO 错误
1.错误描述 (mx.messaging.messages::ErrorMessage)#0 body = (null) clientId = "18CE3B03-9709-9DA8-763 ...
- 【译】gRPC负载均衡
原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. ...
- 关于省市联动的bug
一,问题描述 1.1,原来的思路 1.1.1,初始化加载省份 $.ajax({ 'type' : 'POST', 'dataType' : 'json', 'url' : '${rc.contextP ...