python核心编程和python基础教程(从0开始的Python学习014面向对象编程推荐)
python核心编程和python基础教程
从0开始的Python学习014面向对象编程推荐简介
到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程。还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程。
类和对象是面向对象编程的两个重要方面。对于类和对象的关系,举个例子就像学生和小明同学的关系一样。学生(类)是一个拥有共同属性的群体,小明同学(对象)是其中一个有自己特性的个体。
对于一个对象或类的变量被称为域,函数被称为类或对象的方法。
域有两种类型--属于每个对象或属于类本身,分别成为实例变量和类变量。
类使用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面向对象编程详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
原文链接:https://www.cnblogs.com/liuhappy/p/10640952.html- python选择排序最大最小同时排序(Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例)
- python中mat文件怎么读(Python第三方库h5py_读取mat文件并显示值的方法)
- opencv抠出边缘检测的图形(python opencv实现图像边缘检测)
- python钉钉机器人(python钉钉机器人运维脚本监控实例)
- python停止执行的代码(python定时检测无响应进程并重启的实例代码)
- python3常见问题(对Python3使运行暂停的方法详解)
- 聊天室python小程序(用Python写一个模拟qq聊天小程序的代码实例)
- pythonlambda详解(Python的条件表达式和lambda表达式实例)
- python获取当前时间戳(Python基于datetime或time模块分别获取当前时间戳的方法实例)
- python指定参数教程(详解Python传入参数的几种方法)
- python模块化打包(python使用Paramiko模块实现远程文件拷贝)
- python 内存读写(详解python持久化文件读写)
- python中导入模块的命令(Python3 导入上级目录中的模块实例)
- python字典的值排序(python 对字典按照value进行排序的方法)
- python如何用md5作为文档名(Python生成MD5值的两种方法实例分析)
- python操作json库(Python将json文件写入ES数据库的方法)
- 汉族(汉族的祖先是谁)
- 中国有几个名族(中国有几个民族没列入56个民族)
- 数学语文题目(语文的数学题)
- 香蕉(香蕉三种人不宜吃)
- 没钱可以快乐吗(没钱也能快乐吗)
- 快乐是什么(快乐就是)
热门推荐
- 在php中遍历数组使用(PHP读取远程txt文档到数组并实现遍历)
- 织梦添加模板(解决织梦安装模板时提示不能安装的问题)
- laravel接口请求模拟(Laravel框架控制器的request与response用法示例)
- windows10怎么设置iis框架(Windows10系统如何安装IIS服务器)
- 云主机状态错误(云主机解析IP无法访问网站原因)
- css渐变有几种(CSS 还能这样玩?奇思妙想渐变的艺术)
- vue router用法(如何在Vue 3中扩展Vue Router链接详解)
- for循环能有两个变量吗(关于var在for循环遇到的问题解决)
- docker自动入门教程(Docker Machine深入详解)
- 小米机器狗用什么二次开发(小米正式开源 SQL 智能优化与改写工具 SOAR)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9