类与对象

1.什么是类

类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问题

对应。

2.什么是对象

对象是由类创造出来的变量,它可以调用类里面的所以函数(方法),效果就像函数的函数名,可以操作函数一样。

3.类与对象的编程方式

liu是类,a为liu这个类创造出来的对象。

4.类里面self的作用

在类编程里self是一个重要的参数,它在类的方法里面无处不在,那么它到底是什么呢?

由代码可以看出这里的这个的self就a这个对象,所以python自动传入的这个参数就a这个变量。

为什么要把a这个变量传入类里面的方法中呢?原因是为了在类里面进行封装。

5.封装

当有多个参数需要传入类里面的方法的时候,可以利用封装这些参数,让传参变得很简洁。

这是self的一种利用方式,但是我们一般不这么做,

如果只是在f1里面定义self.bb=123,不执行f1函数则f2 没有办法拿到self.bb=123这个代码,就无法打印self.bb了。

根据以上的代码,如果类里面想要使用self.bb则需要在调用里面方法的时候已经把self.bb=123定义了。

在封装的时候我们利用__init__这个方法进行封装,原因是当我们执行类名+()的时候__init__就执行了。

只要__init__执行以后,就可以把init里的东西都定义了,以后在类或者类外面的代码都可使用

一旦定义以后里面用self 外面用a。注意这里的self 等于啊只有在类里面才默认,就是在类里面输出self.dd和a.dd都是一样的,但是外面不不行,除非定义一个self = a才能执行self.bb

因为a在外面创建的可以为全局变量,self只是类里面的方法创建的为局部变量,这种初始化的方法 我们称为构造方法。对应python销毁对象的方法为析构方法__del__python自己执行的。

6.继承

类与类之间存在子类和父类的关系。子类可以继承父类的方法。

并且继承具有传递性,a继承b,b继承c,则a就会继承c的方法。

如果两个类里面都有会优先去自己里面找方法,没有再去找父类方法。

多继承:

多继承只在python里面有,寻址方法的顺序是自己,左边第一个父类,第二个父类,以此类推。

多继承里面当父类有多重的情况利用图形记忆

情况1:

情况2:

如果是上图的情况,则python会找1然后2然后3然后是1和3的父类最后4.所以在第一种情况中间加了一个父类的时候,会找完夹在中间的父类,再按照情况1来找。

7.多态

python原生支持多态

在python里面往函数里面传类的时候不用把类的名字规定好,只要一个人x。什么类都可以传入。其它语言里面需要在x前面规定类的名字。

并且python默认没有接口。

补充:

注意在执行某个类里面的方法的时候,如果这个方法又调用的其它方法,这个时候你要注意,调用方法的时候self是那个类创造的对象,就由那个类开始找这个方法,而不是从正在

执行的这个类里面开始找方法。A,B,C都有ooo方法,上图d1找xxx的时候到了c在里面用xxx执行ooo,但是不是从c开始找ooo,因为self的d1由D所创造,所以根据找方法原则,则会在D类的位置

开始找ooo,所以最后在A里面找到,而不是C里面找到。

继承父类的__init__方法

未继承:

继承以后:

注意如果出现b()这样的代码就会初始化一次所以打印了这个多22,11。

这样就不会出现上面代码中的多次初始化。注意这里super里面传的self是c自己,他被传入上面的代码里面进行初始化。

初始化的顺序由代码决定。

利用反射查找类和对象里面的成员

对象可以找类和对象里面的成员,类只能找类里面的成员

利用反射导入模块,查找类创建对象,查找对象里面的元素

静态字段

尽量保持,自己的成员,自己去访问,除了类中的方法,用对象去访问

以后不到万不得已不要用对象a去调用,都用liu去调用。

用类去调用类里面的方法需要传入这个类创立的对象作为参数,所以我们一般不这么做,用对象调用的时候参数是python帮我们传输的。

静态方法

静态方法不用传入对象这个参数,并且对象和类都可以访问,不到万不得已都用类访问。

静态方法不需要创建对象就可以调用,相当于在类里面写了一个函数,这个对Java和c#就有用,因为他们只能用面向对象去编程。

类方法

类方法默认传入参数是类名,一般用类调用,虽然对象也可以调用,并且传入参数也是类名(python好变态)

特性

通过类似于字段的形式用对象调用函数,注意这里只能用对象调用,因为没有括号所以如果用类调用没有办法自动传入self这个参数。并且特性方法只能有一个参数self多了

会报错,因为self是python自动传入的。其它参数只能手动传入,可是没有括号让其传入参数,所以会报错。

重新设置特性的值

重新设置字段

成员修饰符(公有,私有)

成员修饰符用两个__表示,并且只能在内部用方法输出

外部输出会出错

对于私有的只有自己能访问自己,子类和父类都不能访问,只有自己好使

函数也是一样的只有在内部方法里面执行

静态方法和普通方法都是可以在内部调用的

python强行外部调用私有方法,万不得已不要用

面向对象特殊的方法

__init__,__del__

对象后面加()执行__call__方法

_getitem__,_setitem__,_delitem__

__dict__获取对象和类里面的元素

__iter__

注意在执行__call__方法的时候,self还是对象本身,不是对象加括号产生的新变量

所以某个类里面的self都是对象这个变量。

注意图中的self.__new__就是FOO调用__new__方法,所以才会到FOO里面去找__new__方法的,而不是obj,因为

__call__里面的参数是self是FOO所以用FOO调用方法__new__的时候就是用类调用所以参数里面要加入self,注意这里的

self也是Foo,因为类调用函数的时候可以传对象也可传类名。

如果一个类是另外一个类创造的则调用它的时候。它可以充当类或者对象。

上面地址讲诉了新式类和经典类的区别。

对象调用函数会默认传入对象这个参数就是self,类调用函数不会默认传入参数,所以参数可以传类,对象或者任何东西。

python的类与对象的更多相关文章

  1. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  2. python的类和对象2(self参数)

    python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...

  3. Python初识类与对象

    Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...

  4. python的类和对象——番外篇(类的静态字段)

    什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...

  5. python的类和对象——进阶篇

    写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...

  6. Python 定制类与其对象的创建和应用

    1.创建新类Athlete,创建两个唯一的对象实例sarah james,他们会继承Athlete类的特性 >>> class Athlete: def __init__(self, ...

  7. 【Python】类和对象、继承、使用文件、存储、异常、标准库(不懂)

    当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self ...

  8. 搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...

  9. Python深入类和对象

    一. 鸭子类型和多态 1.什么是鸭子类型: 在程序设计中,鸭子类型(英语:Duck typing)是动态类型和某些静态语言的一种对象推断风格."鸭子类型"像多态一样工作,但是没有继 ...

随机推荐

  1. angularJs ng-model/ng-bind

    ng-bind 与ng-model区别ng-bind是从$scope -> view的单向绑定,也就是说ng-bind是相当于{{object.xxx}},是用于展示数据的.ng-modle是$ ...

  2. SQL的OPENROWSET开启和使用方法

    [转载]SQL的OPENROWSET开启和使用方法 1.开始 -> 所有程序  -> Microsoft SQL Server 2005  -> 配置工具  -> SQL Se ...

  3. Windows 查看端口占用和关闭进程

    支持原创地址 :http://www.cnblogs.com/moodlxs/p/4145384.html 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PI ...

  4. HDU 2795 Billboard(区间求最大值的位置update的操作在query里做了)

    Billboard 通过这题,我知道了要活用线段树的思想,而不是拘泥于形式, 就比如这题 显然更新和查询放在一起很简单 但如果分开写 那么我觉得难度会大大增加 [题目链接]Billboard [题目类 ...

  5. .NET并行编程 - 并行方式

    使用多线程可以利用多核CPU的计算能力,可以提供更好的程序响应能力,但是每个线程都有开销,需要注意控制线程的数量. 1. System.Threading.Thread 使用多线程最直接的是使用Sys ...

  6. Druid数据库连接池配置

    DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...

  7. Redis复制与可扩展集群搭建

    抄自:http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster 讨论了Redis的常用数据类型与存储机制,本文会讨论一 ...

  8. [SGU495] Kids and Prizes (概率dp)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 题目大意:有N个盒子,里面都放着礼物,M个人依次去选择盒子,每人仅能选一次,如 ...

  9. C语音常用库和函数

    #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h> //定义错误码 # ...

  10. 72. Generate Parentheses && Valid Parentheses

    Generate Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']', ...