关键词:
简介
到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程。还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程。
类和对象是面向对象编程的两个重要方面。对于类和对象的关系,举个例子就像学生和小明同学的关系一样。学生(类)是一个拥有共同属性的群体,小明同学(对象)是其中一个有自己特性的个体。
对于一个对象或类的变量被称为域,函数被称为类或对象的方法。
域有两种类型--属于每个对象或属于类本身,分别成为实例变量和类变量。
类使用class关键字创建,类的域和方法被列在一个缩进块中。
self
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self
。
虽然你可以给这个参数任何名称,但是 强烈建议 你使用self
这个名称——其他名称都是不赞成你使用的。使用一个标准的名称有很多优点——你的程序可以迅速识别它,如果使用self
的话,还有些IDE(集成开发环境)也可以帮助你。
给C++/Java/C#程序员的注释
Python中的self
等价于C++中的self
指针和Java、C#中的this
参考。
你一定很奇怪Python如何给self
赋值以及为何你不需要给它赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass
和这个类的一个实例MyObject
。当你调用这个对象的方法MyObject.method(arg1,
arg2)
的时候,这会由Python自动转为MyClass.method(MyObject, arg1,
arg2)
——这就是self
的原理了。
这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self
参数
(这个概念好长啊。。。。。。)
类
class 类名(): 代码块
‘‘‘the first class from liu
我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。 接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。(我们将在下面的章节中学习更多的如何创建实例的方法)。为了验证,我们简单地打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。 可以注意到存储对象的计算机内存地址也打印了出来。这个地址在你的计算机上会是另外一个值,因为Python可以在任何空位存储对象。 ‘‘‘ class Person: pass # 空块 p = Person() print (p) print(__doc__)
运行结果
我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。
接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。为了验证,我们简单地打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。
可以注意到存储对象的计算机内存地址也打印了出来。这个地址在你的计算机上会是另外一个值,因为Python可以在任何空位存储对象。
对象的方法
对象的方法其实就是一个函数,只不过在这个函数会有一个特别的参数self。
class Person: def sayHi(self): print(‘Hello,how are you?‘) p = Person() p.sayHi()
运行结果
这个self感觉不到它的作用,但是还是要在参数中定义这是为什么呢?
去掉self
从报错中看出系统在调用这个类方法的时候默认给它传了一个参数,所以我们必须要有这个self,不为别的,因为报错。。。。。。
__init__方法
init是一个初始化块,在对象被建立的同时运行这个代码块,为你的对象初始化。需要注意的是名称的开始和结尾都要有两个下划线。
‘‘‘__init__方法 __init__一个对象被建立的时候,马上运行。这个方法是对你的对象的初始化。 这个名称的开始和结尾都是双下划线。‘‘‘ class Person: def __init__(self,name): self.name = name def sayHi(self): print(‘Hello,my name is ‘,self.name) p = Person(‘happyLiu‘) p.sayHi()
运行结果
感觉效果不明显。。。
class Person: def __init__(self,name): print(‘这是初始化块‘) self.name = name def sayHi(self): print(‘Hello,my name is ‘,self.name) p = Person(‘happyLiu‘) p.sayHi()
这样就好啦。
类与对象的变量
类的变量 由一个类的所有对象(实例)共享使用。
对象的变量 由类的每个对象/实例拥有。
可以理解为类的变量是这个类下所有对象公用的,而对象的变量是这个对象私有的。
一个很长的例子
class Person: population = 0 def __init__(self,name): self.name = name print(‘Initalizing %s‘ % self.name) Person.population += 1 def __del__(self): print(‘%s says bye.‘ % self.name) Person.population -= 1 if Person.population == 0: print(‘I am the last one.‘) else: print(‘There are still %d people left.‘ % Person.population) def sayHi(self): print(‘Hi, my name is %s.‘ % self.name) def howMany(self): if Person.population == 1: print(‘I am the only person here.‘) else: print(‘We have %d persons here.‘ % Person.population) happy = Person(‘happyLiu‘) happy.sayHi() happy.howMany() bob = Person(‘bob james‘) bob.sayHi() bob.howMany()
del bob happy.sayHi() happy.howMany()
运行结果
像__init__
方法一样,还有一个特殊的方法__del__
,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。
使用不同的对象的时候,就会调用类的方法,但是传的参数是这个对象自己的,所以我们面向对象的编程是非常灵活的。
继承
class 子类(父类): 代码块
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系。
人是父类,男人是子类,小明是对象(小明没有对象,(¬︿??¬☆))。
一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象。
另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而如果我们使用独立的类的话,我们就不得不这么做了。
举个栗子
class SchoolMember: ‘‘‘Represents any school member.‘‘‘ def __init__(self,name,age): self.name = name self.age = age print(‘(Initialized SchoolMember: %s)‘%self.name) def tell(self): ‘‘‘Tell my details.‘‘‘ print(‘Name:%s Age:%d‘%(self.name,self.age)) class Teacher(SchoolMember): ‘‘‘Represents a teacher.‘‘‘ def __init__(self,name,age,salary): SchoolMember.__init__(self,name,age) self.salary = salary print(‘(Initialized Teacher: %s)‘ % self.name) def tell(self): SchoolMember.tell(self) print(‘Salary:"%d"‘ % self.salary) class Student(SchoolMember): ‘‘‘Represents a student.‘‘‘ def __init__(self, name, age, marks): SchoolMember.__init__(self,name,age) self.marks = marks print(‘(Initialized Student: %s)‘ % self.name) def tell(self): SchoolMember.tell(self) print(‘Marks: "%d"‘%self.marks) t = Teacher(‘Mr,Liu‘,25,3000) s = Student(‘Swaroop‘, 22, 75) print() members = [t,s] for member in members: member.tell()
运行结果
为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基本类的__init__
方法专门使用self
变量调用,这样我们就可以初始化对象的基本类部分。这一点十分重要——Python不会自动调用基本类的constructor,你得亲自专门调用它,SchoolMember.__init__(self,name,age)就是它,开始的时候无限报错的就是它。
小总结
我们已经研究了类和对象的多个内容以及与它们相关的多个术语。通过本章,你已经了解了面向对象的编程的优点和缺陷。Python是一个高度面向对象的语言,理解这些概念会在将来有助于你进一步深入学习Python。
python学习-面向对象1(代码片段)
参考:http://www.cnblogs.com/wupeiqi/概述python的编程方式分为三种面向过程:根据业务的逻辑,从上到下一行一行的编写代码函数式:将某些功能封装在函数里,需要调用时只需要调用函数面向对象:对函数进行再次封装与分类,更... 查看详情
python面向对象编程02:深度认识类class(代码片段)
...式的Python专栏第37篇,同学站住,别错过这个从0开始的文章!前篇学委展示分享了面向对象编程的概念,相信读者们对这个类和对象比较熟悉了。我们在深入看一下类的结构。类中的其他内置函数/属性前文代码展... 查看详情
python面向对象编程01:入门类和对象(代码片段)
...式的Python专栏第36篇,同学站住,别错过这个从0开始的文章!前面写了文件的读取和文件处理等其他函数,里面用到了os库。本来想分享os库,发现这个库可能对于初学者来说比较难,所以后面再等合适的... 查看详情
python学习笔记之面向对象(代码片段)
一、面向过程VS面向对象 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路... 查看详情
python面向对象编程04:重写object通用函数(代码片段)
...式的Python专栏第39篇,同学站住,别错过这个从0开始的文章!前篇学委展示分享了类的继承和重写,面向对象还有一些概念,我们看看一些object的通用函数,继续跟上吧!PythonOverride重写就重新定义ÿ... 查看详情
python面向对象编程03:类继承和其衍生术语(代码片段)
...式的Python专栏第38篇,同学站住,别错过这个从0开始的文章!前篇学委展示分享了面向对象编程和深度认识类的结构,最后稍微提到了继承。这次我们把继承和继承衍生的术语一并解释Python支持单继承,多继... 查看详情
python基础之类与模块化(代码片段)
Python基础之类与模块化0.学习目标1.面向对象编程:类1.1面向对象编程的基本概念1.1.1多态1.1.2封装1.1.3继承1.2自定义类1.3再谈继承1.3.1继承实例1.3.2多继承2.模块2.1导入模块2.2导入Python标准模块2.3单独导入模块中所需对象2.4导入... 查看详情
写给python社群的第6课:终于学习python类和面向对象了,上坡开始(代码片段)
文章目录⛳️类的简介⛳️面向对象的编程🔥定义类🔥类的实例🔥属性🔥类的继承和方法重写🔥类的私有属性和方法🔥静态类🔥类的其它知识⛳️类的简介Python中的类本质上也是一种数据类型... 查看详情
面向对象编程
一、概述 在学习面向对象之前,我们用函数来封装我们的功能,当我们要使用时,就调用函数来实现我们的需求。现在我们学习了面向对象的知识,知道了类和对象,其实函数式编程和面向对象编程都可以减少重复代码,不... 查看详情
python面向对象编程01:入门类和对象(代码片段)
...式的Python专栏第36篇,同学站住,别错过这个从0开始的文章!前面写了文件的读取和文件处理等其他函数,里面用到了os库。本来想分享os库,发现这个库可能对于初学者来说比较难,所以后面再等合适的... 查看详情
面向对象初步(代码片段)
1.注意:Python支持(1)面向过程(2)面向对象(3)函数式编程等多种编程范式2.面向对象编程的思想主要是针对大型软件设计而来的.面向对象编程使得程序的扩展性更强,可读性更好,使得编程可以像搭积木一样简单.3.面向对象编程将数据... 查看详情
从0开始学java1.面向对象的特征有哪些方面
... 1、面向对象的特征有哪些方面 1.Java基础培训,从0开始学Java:抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一... 查看详情
想学python从哪里入手
初学者学习Python需循序渐进,可以从以下内容入手学习:1.Python基础知识学习任何一门编程语言都需要学习相关语法知识,Python基础知识的学习主要包括Python解释器执行原理、字符编码、注释、变量、缩进、流程控制、文件操作... 查看详情
stage4--python面向对象
...前面:Stage1—Stage4简单介绍一下Python语法,Stage5开始用python实现一些实际应用,语法的东西到处可以查看到,学习一门程序语言的最终目的是应用,而不是学习语法,语法本事其实很简单,本系列希望... 查看详情
怎样制作,编程码,写自己想说的话
....选择语言1)确定您感兴趣的领域。您可以从任何编程语言开始学习(尽管有些语言比其他语言“更容易”),因此请先问问自己,您通过学习编程语言想要达到什么目的?这将帮助您确定应该从事哪种类型的编程,并为您提供一... 查看详情
python入门-6面向对象编程:07面向对象三大特征(封装继承多态)-继承(代码片段)
一:面向对象三大特征介绍 Python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装(隐藏)、多态。 封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装... 查看详情
python学习笔记——类(代码片段)
...基本单元,一个对象包含数据和操作数据的函数2、在python中,所有数据类型都被视为对象,也可以自定义对象。自定义对象数据类型就是面向对象中类的概念需要学习的部分:1、类(Class):用来描述具有相同的 查看详情