面向对象详解

简介:

面向对象:对象各自完成各自任务,面向过程是相当于领导者帮各对象完成任务。面向对象有点模块化的意思,面向过程有牵一发动全身的意思。面向过程就有点什么东西都得考虑到,面面俱到的意思。

wKiom1nR56_zmWfPAAB3y2qw6Ik035.png-wh_50 

 

类:说到面向对象必须知道类,例:类就是一个飞机模板,飞机就是对象。类就是一个模型,对象就是一个真正看得见摸得着的实体:

wKioL1nR53LQ-wouAAB2dWlS83Y579.png-wh_50 

类的3个组成部分:

类型的名称:类名

类的属性:一组数据

类的方法:允许对进行操作的方法(行为),也就是它的功能

wKioL1nR59vw6IGQAAA83RDCMv0142.png-wh_50 wKiom1nR6DWxOj2JAAAlu0euF50446.png-wh_50

 

定义一个类:

class 类名:

#属性

#方法

def eat(self):

    print(猫在吃鱼)

def drink(self):

    print(猫在喝kele...)

 

创建一个对象就是在内存中开辟了一个内存空间

wKioL1nR6CzDUWVmAABTSfepQT4301.png-wh_50创建对象结果就是返回一个内存指向值。

wKioL1nR6FWgJOB8AACKAd5xeeQ993.png-wh_50对象使用的方法。

 

属性不要在类里面定义,直接在调用时添加即可:

 wKioL1nR6IbzNKuvAADx7YveZxY640.png-wh_50

调用属性时也可以直接用函数定义在类里,然后通过类调用即可。

wKiom1nR6QDC2KHxAAE9MKlSsJA287.png-wh_50self是谁调用self就是谁。

 

__init__:初始化对象属性,不需要调用自动调用即可执行,默认值的设定。也称为魔法方法,具有特殊功能的方法。

 

最好的属性添加应该在初始化对象时通过__init__初始化,然后在调用类时传递参数。

 

 wKioL1nR6OPBBF8FAAGkbvavyTY520.png-wh_50

__str__方法:必须要用return,也是自动调用,用来反映对象的描述信息。

wKiom1nR6UDgEjlPAAI32OlBSic178.png-wh_50 

 

类里面的属性就相当于全局变量,然后类里面的方法都可以调用它。

 

 

 

烤地瓜,属性值累加到对象定义完才是真正完成:

 

 wKioL1nR6UTgEeZkAANgw3Gh0sI583.png-wh_50

存家具:在对象里放对象。

wKiom1nR6ZfQFNdJAAOFLghwugU575.png-wh_50 

 

隐藏对象属性:直接获取属性不安全,比如查看某人的工资,要别人允许才行,允许就return返回值,不允许就不rerurn,应该把这个属性做成一个方法,那么隐藏属性就是通过方法来实现,不直接表现出来,这样还可以避免设置成-10而程序不报错的问题。

私有方法:加两个__xx在函数里的,那么不让在外面直接调用,而需要在另一个函数里通过self.x的方式调用,这样可以做到某些功能通过if判断句验证后才能调,起到一个控制作用:

wKiom1nR6cuCS15XAADUQV_lYlc207.png-wh_50 

 

__del__方法:当没有东西调用的时候就用到,一般游戏里英雄死的时候会用到,就像硬链接有几个引用,直到最后一次引用被干掉后就会执行__del__

wKioL1nR6ZCDXAZyAABv1T5WgOg227.png-wh_50 

 

import randomrandom就相当于工具箱,sys是个模块。sys.getrefcount(t)就相当查看硬链接数,它比实际的要多1.

wKioL1nR6Zrw2ydYAACOutAG1VY875.png-wh_50 

 

继承:为什么让程序当中少写代码,直接继承前面创建过的程序即可。让子类直接调用父类即可,甚至猫类的吃可以继承动物类的吃

 wKiom1nR6h6iF-zgAACVHp2kU_M290.png-wh_50

父类:class xx

子类:class xx():  比父类多一个大括号。


重写:某些方法进化了不好继承了就需要直接修改子类了。调用父类的方法:super().bark()

 

私有方法和私有属性不会被继承,父类有自己的小秘密。但父类里自己通过方法把私有属性调用了,那么其他类再调用这个类的私有属性就可以。

 

多继承:一个类继承了多个父类,类似骡子继承了马和驴子。

Object类是python所有最顶层的类,虽然没调用它但实际调用了。

多继承如下:

wKiom1nZ7PqxEFTkAAC6gAfwnbE588.png-wh_50 

 

如果子类和父类有同样的方法,优先调用自己这个类的。

 

多态:见到领导奉承,见到小弟高高自傲,在程序里,定义的时候不知道调谁,执行的时候才知道调谁:

wKioL1nZ7MKBt1czAAEADVvs2IA255.png-wh_50 

 

面向对象的三个要素:封装(把函数和全局变量放一起)、继承、多态。

 

类属性:类里面的属性,类也是一个对象称为类对象。类属性为每个实例对象共用。如果对象对这个属性改了,那么其他对象再看到时就是被改的属性了:

wKiom1nZ7SSjESg2AAGhOZq_DKk006.png-wh_50 

 

实例对象:由类创建出的对象,里面的属性不能被其他对象共用,如果非要用要通过特殊的方法来调用。

 

实例属性:实例对象里的属性,仅在对象内有效。

 

一个类的方法实际上并没有每次创建对象的时候把这个方法给它,只是这个类有一个特殊的属性保存着一些信息记录着类的方法,需要调用时引用即可。

 

类方法:@classmethod  可以对类属性进行修改。

        Def  xx(cls):

          

实例方法:类里面的普通函数。

 

静态方法:完成简单功能例如描述信息,跟类无关,跟对象无关,那么就可以用它来完成,书写方法如下:@staticmethod

                        def print_menu():

wKiom1nZ7TSBjLqgAAEn5mO9xio466.png-wh_50 

 

 

 

类来调函数可实现模块化操作,不至于耦合性太强,牵一发动全身。

 

简单工厂模式:为什么实现程序的解耦,创建新的类,而实现互不影响的方式。

 

设计模式:为了解决某一类的问题,而出现由一个个模板组成的模式。

 

工厂方法:在父类里面不实现,再子类里定义,父类再调用即可。

 

__new__:当在一个类里面定了一个new方法,那么即刻执行的只有new方法里的内容,如果想把new方法以为的方法或属性也执行出来,需要在new里面调用父方法。New方法一般需要两个参数,一个参数是把父类传进来,另一个是调用执行的时候传的。

wKioL1nZ7PeAeQasAAOZ-Tzkg7U589.png-wh_50 

 

单例:只有一份,一个对象,你创建就属于你,他创建就属于他。单例通过if判断是否为none,来返回值,第一次创建以后肯定不为none了,那么返回的肯定是else的内容:

wKiom1nZ7ViBrlWfAADHo31PQJs948.png-wh_50 

 

 

异常:程序出现的的错误,比如没定义变量而打印它就会报错。

 

异常处理:异常出现如果直接让整个程序蹦了,相当于犯了个小错却坐牢,正确的做法是抛出这个错误,让程序员知道错在哪里了:

wKiom1nZ7WribOSKAACzJQ33iK0794.png-wh_50 

 

如果每个异常都去定义处理方法,非常麻烦,可以先只定义一两个,其他的都表示为其他异常,可用exception

wKioL1nZ7SqCVWoLAAEuA7uOpFw473.png-wh_50 

 

Finally:如果要把程序里某部分一定要打印出来,那么就可以用到finally。特点是打开文件最后需要关闭的时候。

 

抛出异常:捕获到程序后不予处理又抛回给系统自己处理。

 

空字符串、空字典、空列表都表示假,只有有一点点东西就为真:

wKiom1nZ7Ynx5mkCAAEtbRu1pQM750.png-wh_50 

 

 

模块:具有很多功能的一个集合,.py就是一个模块,如random是一个工具箱也是一个模块。

wKioL1nZ7USQ6pMpAACVVVrgqUE125.png-wh_50 

 

Python里为了达到效率高,会将一段程序引用的其他模块的结果通过一个文件给存起来,避免当整段程序在执行到最后报错重新再来执行时又重新执行这个引入模块的内容而浪费时间和资源,因为引入的模块时不可能出现bug的,所有它的结果没必要再次去执行,用一个pyc的二进制自解码文件存在当前文件下的pyche里。下次用即可。提升运行效率。

wKiom1nZ7Z3QxW5-AAO1aG0iS9A593.png-wh_50 

两种方式导入模块:一种为import xx方式,那么每次调用都要xx.yy的方式,另一种为from xx import c,那么以后可以直接用c

 

__name__:当别人调取本模块时,不直接执行本模块内容,而是需要调用模块内方法时才执行,而本模块内部调用则需要直接执行。

 

import pygame 导入游戏模块,很多功能都在此模块,主要是2D游戏。

本文转自  流颗星  51CTO博客,原文链接:http://blog.51cto.com/liukexing/1970191


相关文章
|
2月前
|
Java
面向对象
面向对象
32 6
|
5月前
初识面向对象
初识面向对象
|
6月前
|
Java 编译器
面向对象篇
面向对象篇
|
6月前
|
机器人 Java 数据安全/隐私保护
理解-面向对象
理解-面向对象
42 0
面向对象(1)
面向对象(1)
73 0
到底什么是面向对象。
到底什么是面向对象。
42 0
|
Java
2. 面向对象(三)
2. 面向对象(三)
145 0
|
Java 编译器
初识面向对象上
初识面向对象上
123 0
初识面向对象上
|
Java 程序员 C语言
关于面向对象的深入理解
最开始的计算机程序编码就是0101,程序员完全要以机器的二进制思维去思考问题;后来有了汇编只是编码形式上有了变化,但是本质并没有改变,程序员们的关注点还是在于机器本身,程序员要对CPU、寄存器等硬件了如指掌;当C语言、COBOL等面向过程的语言横空出世后,这是一次本质上的革命,把程序员从二进制的世界中解救了出来,终于可以让他们“像人一样”去思考问题啦。
关于面向对象的深入理解
|
JavaScript
关于面向对象
一、概述 js对面向对象的实现就是给函数一个原型对象(Prototype),两者结合可以用来表达类。类的实质就是由两个对象组合而成(函数是特殊的对象),它们通过prototype和constructor属性相互引用。
625 0
下一篇
无影云桌面