面向对象编程(1)-类和实例
类和实例
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
仍以Student类为例,在Python中,定义类是通过class
关键字:
class Student(object):pass
class
后面紧接着是类名,即Student
,类名通常是大写开头的单词,紧接着是(object)
,表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object
类,这是所有类最终都会继承的类。
定义好了Student
类,就可以根据Student
类创建出Student
的实例,创建实例是通过类名+()实现的:
>>> bart = Student()
>>> bart
<__main__.Student object at 0x10a67a590> >>> Student <class '__main__.Student'>
可以看到,变量bart
指向的就是一个Student的object,后面的0x10a67a590
是内存地址,每个object的地址都不一样,而Student
本身则是一个类。
可以自由地给一个实例变量绑定属性,比如,给实例bart
绑定一个name
属性:
>>> bart.name = 'Bart Simpson'
>>> bart.name
'Bart Simpson'
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__
方法,在创建实例的时候,就把name
,score
等属性绑上去:
class Student(object):def __init__(self, name, score): self.name = name self.score = score
注意到__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。
有了__init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__
方法匹配的参数,但self
不需要传,Python解释器自己会把实例变量传进去:
>>> bart = Student('Bart Simpson', 59)
>>> bart.name
'Bart Simpson' >>> bart.score 59
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self
,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数和关键字参数。
数据封装
面向对象编程的一个重要特点就是数据封装。在上面的Student
类中,每个实例就拥有各自的name
和score
这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的成绩:
>>> def print_score(std): ... print '%s: %s' % (std.name, std.score) ... >>> print_score(bart) Bart Simpson: 59
但是,既然Student
实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student
类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student
类本身是关联起来的,我们称之为类的方法:
class Student(object):def __init__(self, name, score): self.name = name self.score = score def print_score(self): print '%s: %s' % (self.name, self.score)
要定义一个方法,除了第一个参数是self
外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self
不用传递,其他参数正常传入:
>>> bart.print_score()
Bart Simpson: 59
这样一来,我们从外部看Student
类,就只需要知道,创建实例需要给出name
和score
,而如何打印,都是在Student
类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。
封装的另一个好处是可以给Student
类增加新的方法,比如get_grade
:
class Student(object):...def get_grade(self): if self.score >= 90: return 'A' elif self.score >= 60: return 'B' else: return 'C'
同样的,get_grade
方法可以直接在实例变量上调用,不需要知道内部实现细节:
>>> bart.get_grade()
'C'
小结
类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节。
和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同:
>>> bart = Student('Bart Simpson', 59)
>>> lisa = Student('Lisa Simpson', 87)
>>> bart.age = 8
>>> bart.age
8
>>> lisa.age
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'age'
转载于:https://www.cnblogs.com/shangren/p/8065346.html
面向对象编程(1)-类和实例相关推荐
- python 面向对象编程:类和实例
深度学习在构建网络模型时,看到用类来构建一个模型实例,清晰明了,所以这篇博文主要学习一下python类 类和实例: 类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填 ...
- Python|面向对象编程的类和实例
欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 Python是一门动态语言,面向对象编程是一个我们必 ...
- 前端与移动开发----JS高级----面向对象编程,类与实例对象,继承,严格模式,模板字符串,class封装tab栏
JS高级01 回顾上阶段 Javascript组成 ECMAScript: 基础语法 (变量, 表达式, 循环, 判断, 函数, 对象等) DOM: document 操作标签(获取, 增加, 插入, ...
- Python面向对象编程:类继承和其衍生术语
Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...
- Python面向对象-概念、类、实例
Python面向对象-概念.类.实例 OOP--Object Oriented Programming,面向对象编程,是一种程序设计思想.该思想将对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)
文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法
1. 类的创建并实例化 类的定义:在Python中,类通过 class 关键字定义.按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的.下面是一 ...
- python实例属性与类属性_Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法...
1. 类的创建并实例化 类的定义:在Python中,类通过class 关键字定义.按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的.下面是一个 ...
- python面向对象图片_Python面向对象-概念、类、实例
OOP--Object Oriented Programming,面向对象编程,是一种程序设计思想.该思想将对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 区别于面向过程的程序设计即把计 ...
最新文章
- ACMNO.33 C语言-最大值3 分别用函数和带参的宏,从三个数中找出最大的数。
- SAP RETAIL 商品主数据里影响自动补货结果的几个参数 II
- Spring4.X系列之IOC
- 人工智能学习实战之路
- NET框架下如何使用PaddleOCRSharp
- 查看局域网内所有用户
- JAVA学习第六十三课 — 关于client服务端 amp;amp; URL类 amp; URLConnection
- .Top域名:新顶级域名还原互联网安全发展
- 游戏中的物品管理系统
- AutoCAD 2019 mac中文
- 无人驾驶虚拟仿真(十五)--障碍物检测与识别1
- 如何在python导入包_python如何导入包
- [BZOJ1779][Usaco2010 Hol]Cowwar 奶牛战争(最大流)
- 实验11-1-7 藏头诗 (15 分)
- 宿舍管理系统之登录功能
- 程序员福音 免费在线制作证件照
- java实现手机扫码登录客户端
- 开始甲骨文培训了,第一天说了一下上课学习规矩及计算机基础
- InnoDB执行delete时到底做了什么?
- 我的京东管理生涯随想 1