课时37:类与对象:面向对象编程
目录:
一、self是什么
二、Python的魔法方法
三、公有和私有
四、课时37课后习题及答案
*****************
一、self是什么
*****************
对象的方法都有一个self参数,那这个self参数是什么呢?如果之前接触过其它的编程语言,例如c++,那么你应该很容易对号入座,Python的self其实就相当于C++的this指针。
如果把类比作是图纸,那么由类实例化后的对象才是真正可以住的房子。根据一张图纸就可以设计出成千上万的房子,它们长得都差不多,但它们都有不同的主人。每个人都只能回到自己的家里,陪伴自己的孩子...所以self这里相当于每个房子的门牌号,有了self,你就可以轻松找到自己的房子。Python的self是同一个道理,由同一个类可以生成无数的对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么Python就知道需要操作哪个对象的方法了。
通过一个例子感受下:
class Ball: def setName(self, name): self.name = name def kick(self): print("我叫%s,该死的,谁踢我..." % self.name)
>>> a = Ball() >>> a.setName('球A') >>> # 第一个参数self告诉Python是a对象在调用方法,因为是隐藏的并且由Python自己传入,所以我们这里不需要写进来。 >>> b = Ball() >>> b.setName('球B') >>> c = Ball() >>> c.setName('土豆') >>> a.kick() 我叫球A,该死的,谁踢我... >>> b.kick() 我叫球B,该死的,谁踢我... >>> c.kick() 我叫土豆,该死的,谁踢我...
self参数的详解可以参考博客:https://blog.csdn.net/CLHugh/article/details/75000104
**************************
二、Python的魔法方法
**************************
Python的对象天生拥有一些神奇的方法,它们是面向对象的Python的一切。Python的这些具有魔力的方法,总是被下划线所包围的,今天就来说一说一个最基本的特殊方法:_ _init_ _()。
通常把_ _init_ _()方法称作构造方法,_ _init_ _()的魔力体现在只要实例话一个对象,这个方法就会在这个对象被创建时自动调用(在c++里可以看到类似的东西,叫“构造函数”)。
其实,实例化对象时是可以传入参数的,这些参数会自动传入_ _init_ _()方法中,可以通过重写这个方法来自定义对象的初始化操作。举个例子:
class Ball: def __init__(self, name): self.name = name def kick(self): print("我叫%s,该死的,谁踢我..." % self.name)
>>> p = Ball("土豆") >>> p.kick() 我叫土豆,该死的,谁踢我...
******************
三、公有和私有
******************
一般面向对象的编程语言都会区分公有和私有的数据类型,像c++和Java它们使用public和private关键字,用于声明数据是公有的还是私有的,但在Python中并没有用类似的关键字来修饰。
难道Python所有东西都是透明的?也不全是,默认上对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问:
>>> class Person: name = '小甲鱼' >>> p = Person() >>> p.name '小甲鱼'
为了实现类似私有变量的特征,Python内部采用了一种叫name mangling(名字改编)的技术,在Python中定义私有变量只需要在变量名或函数名前加上“_ _”两个下划线,那么这个函数或变量就会成为私有的了:
>> class Person: __name = '小甲鱼' >>> p = Person() >>> p.__name Traceback (most recent call last): File "<pyshell#23>", line 1, in <module> p.__name AttributeError: 'Person' object has no attribute '__name'
这样在外部将变量名“隐藏”起来了,理论上如果要访问,就需要从内部进行:
class Person: __name = '小甲鱼' def __init__(self,name): self.__name = name def getName(self): return self.__name
>>> p = Person("小甲鱼") >>> p.__name Traceback (most recent call last): File "<pyshell#25>", line 1, in <module> p.__name AttributeError: 'Person' object has no attribute '__name' >>> p.getName() '小甲鱼'
但是你认真琢磨一下这个技术的名字name mangling(名字改编),那么不难发现其实Python只是动了一下手脚,把双下横线开头的变量进行了改名而已。实际上在外部你使用“_类名_ _变量名”即可访问双下横线开头的私有变量了:
>>> p._Person__name '小甲鱼'
(注:Python目前的私有机制其实是伪私有,Python的类是没有权限控制的,所有变量都是可以被外部调用的。)
********************************
四、课时37课后习题及答案
********************************