python|一个渣男语言的一辈子


前言python

Python从设计之初就已是一门面向对象的语言,本章节咱们将详细介绍Python的面向对象编程。编程


【1】面向对象?对象?!

以前说过,用任何编程语言来开发程序都是让计算机为咱们干活,那python怎么干活呢?或者说用什么方法对什么东西作什么事呢?app

举个栗子,咱们要用python:拿菜刀切豆腐(鬼知道怎么实现?)编程语言

分析一下:方法是用菜刀,东西是豆腐,作的事情就是切豆腐。这三个在python里面都叫“对象”——没错,变态的python(小渣子)为了告别单身,居然——“万物皆对象”。两个数据成员(类变量和实例变量)啦、方法啦通通都是对象!ide

那你说,我用刀切豆腐能够,切火龙果也行啊,“切”就能够归为一类吧?没错,就是这样子!并且真的叫类(Class)哦!对象就是类的实例啦。既然咱们作事方式(方法)同样,他们性别(属性)同样,那咱们在这些方面就是一类嘛!还能够生宝宝哦,爸爸类(父类)生baby类(子类),baby类继承爸爸类的东西,baby类长大后也会成为爸爸类。并且若是baby类不满意本身的爸爸,能够改写本身(注意:此处没有隔壁老王)!python中叫方法重写(若是从父类继承的方法不能知足子类的需求,能够对其进行改写,也叫方法的覆盖(override))函数

归类好了,python问你,要我切什么?你说,切豆腐吧,这就叫作类的实例化(豆腐就是切的东西的实例),告诉python它具体要作什么。切的东西变来变去,这些变化的东西就叫类变量,类变量一般不做为实例变量使用、定义在类中且在函数体以外、在整个实例化的对象中是公用的。spa

说了这么多,其实不论是说切的东西(类变量)和具体要切的火龙果仍是豆腐(实例变量)统称为数据成员;“切”这个处理的动做在python中叫作方法,其实就是类中定义的函数。面向对象呢,数据封装、继承和多态是它的三大特色,具体就是对函数进行分类和封装,让开发“更快更好更强...”.设计

【2】类和实例

面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,好比Food类,而实例是根据类建立出来的一个个具体的“对象”,每一个"对象"都拥有相同的方法,但各自的数据可能不一样orm

一、寻找对象——建立类

以Food类为例,在Python中,定义类是经过class关键字:对象


Food类实例

class后面紧接着是类名,即Food,类名一般是大写开头的单词紧接着是(object),表示该类是从哪一个类继承下来的,一般,若是没有合适的继承类,就使用object类,这是全部类最终都会继承的类。而后以冒号结尾。

类的帮助信息能够经过ClassName.__doc__查看哦!

二、找到对象——建立实例

建立类就是用来用的,那就须要将类实例化。

1)实例化类其余编程语言中通常用关键字 new,可是在 Python 中并无这个关键字,类的实例化相似函数调用方式。如下使用类的名称Food 来实例化,并经过 __init__ 方法接受参数

先来看一个类的实例:


Food类

能够看到,建立实例是经过类名+()实现的,能够自由地给一个实例变量绑定属性,好比,给实例Food绑定name、size等属性。另外,因为类能够起到模板的做用,所以,能够在建立实例的时候,把一些咱们认为必须绑定的属性强制填写进去。经过定义一个特殊的__init__方法,在建立实例的时候,就把name,score等属性绑上去。

fooKind 变量是一个类变量,它的值将在这个类的全部实例之间共享。你能够在内部类或外部类使用 Food.fooKind访问。

__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当建立了这个类的实例时就会调用该方法。( 注意:方法“__init__”先后分别有两个下划线!!!)

②self 表明类的实例而非类,self 在定义类的方法时是必须有的,虽然在调用时没必要传入相应的参数。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。有了__init__方法,在建立实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不须要传,Python解释器本身会把实例变量传进去。

③类的私有方法__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用self.__private_methods

2)有关python那些对象的人设(属性)

①访问属性:使用点(.)。如self.name能够知道名字

②添加属性。如:Celery.name=Celery能够添加一个芹菜的name属性

③修改属性。如:Celery.name=Delicious Celery 能够修改芹菜的name属性

④删除属性。如:del Celery.name

⑤也可使用如下函数的方式来操做:

getattr(obj, name[, default]) : 访问对象的属性,返回该属性的值。

hasattr(obj,name) : 检查是否存在一个属性,若是存在该属性返回 True。

setattr(obj,name,value) : 设置一个属性。若是属性不存在,会建立一个新属性。

delattr(obj, name) : 删除属性。

⑥Python内置类属性

__dict__ : 类的属性(包含一个字典,由类的数据属性组成);

__doc__ :类的文档字符串;

__name__: 类名;

__module__: 类定义所在的模块(类的全名是'__main__.className',若是类位于一个导入模块mymod中,那么className.__module__ 等于 mymod);

__bases__ : 类的全部父类构成元素(包含了一个由全部父类组成的元组)

⑦类的私有属性__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs

三、分手须知—— 对象销毁(垃圾回收)

每当python找到一个对象,他就建立一个引用计数,洋洋得意计算本身有几个对象。当不喜欢人家后, 也就是说, 这个对象的引用计数变为0 时, 她被python完全遗忘(垃圾回收)。在 Python 内心记录着全部使用中的对象各有多少魅力(引用)。

析构函数 __del__ ,__del__在对象销毁的时候被调用,当对象再也不被使用时,__del__方法运行:


劈腿证据


四、结婚生子—— 类的继承

像某天王同样,浪荡多年的python终于安下心来结婚生子,因而出现了爸爸(父类/基类)和baby(子类/派生类).咱们要看看小p会不会像爸爸,就要看他继承了什么。这也许就是python积极找对象的缘由之一吧:好处之一就是代码可重用,毕竟能够生个孩子继承本身的优良基因。

1)在python中继承中的一些特色:

①在继承中基类的构造(__init__())方法不会被自动调用,它须要在其派生类的构造中调用。

②在调用基类的方法时,须要加上基类的类名前缀且须要带上self参数变量。区别在于类中调用普通函数时并不须要带上self参数

③Python老是首先查找对应类型的方法,若是它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先子后父

五、青草盈盈——"多重继承

若是在继承元组中列了一个以上的类,那么它就被称做"多重继承" 。 


神奇!一子多父。

六、家庭破裂—— 方法重写

终于,小p发现了父亲的风流韵事,他决心与其断绝父子关系!重写本身的人生。


狗血啊


来点正经的


说明

终于,python孤独终老。

相关文章
相关标签/搜索