您好,欢迎光临扬州瑞吉输送机械设备有限公司官网! 设为首页收藏本站

惠乐彩票注册第八章 Python 对象和类

  对象一般包含数据(变量,更习惯称之为属性 attribute),也包含代码(函数,也称之为方法)

  当你想要创建一个别人从来都没有创建过的新对象时,首先必须定义一个类,用以指明该类型的对象所包含的内容(属性和方法)

  可以把对象想象成 名词 ,那么方法就是动词。对象代表着一个独立的实物,它的方法则定义了它是如何和其他事物互相作用的。

  和模块不同,你可以同时创建许多属于同一个类的对象,但每个对象又可以有各自的独特的属性。

  面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

  类是对现实世界的某些对象的共性的抽象化。比如球就是对蓝球,足球,乒乓球的抽象化,大部分都有圆形的特征,都是体育用具。

  类就是一个模板,模板里可以包含多个函数和变量(属性),函数里实现一些功能(方法)

  对象则是根据模板创建的实例,通过实例化过的对象可以执行类中的函数(即对象的方法)

  __init__ 是Python中一个特殊的函数名,是一个类的初始化实例的一个方法,用于根据类的定义去创建实例对象;

  self 参数也是python的一个特殊参数的名称,固定格式,self 实际上指的就是正在被创建的对象本身;它是在定义方法的时候的第一个参数,这是必须的。详解见下图:

  这个新对象和其他的对象一样,可以把它当做列表、元组、字典的一个元素,也可以当做参数传给函数,或者当做函数的返回值

  property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

  下面的例子中首先定义一个Duck类,它仅包含一个 hidden_name 属性,我们不希望比人直接访问到这个属性,因此需要定义两个方法,

  在每个方法中添加一个 print() 函数。最后把这些方法设置为 name 属性:

  使用 property 的一个巨大优势:如果你改变某个属性的定义,只需要在类的定义里修改即可,不需要再每一个调用处修改

  封装方法的主要原因是:隔离复杂度,就是把复杂的代码逻辑实现过程封装起来,对于使用者是透明的;给用户用到的只是一个简单的接口。

  封装其实分为两个层面,但无论哪种层面的封装,都要对外界提供好访问你内部隐藏内容的接口(接口可以理解为入口,有了这个入口,使用者无需且不能够直接访问到内部隐藏的细节,只能走接口,并且我们可以在接口的实现上附加更多的处理逻辑,从而严格控制使用者的访问)

  第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj.的方式去访问里面的名字,这本身就是一种封装

  注意:对于这一层面的封装(隐藏),类名.和实例名.就是访问隐藏属性的接口

  第二个层面的封装:类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。

  同上面提到的 隐藏属性的方法一样,在python中用双下划线的方式实现隐藏属性(设置成私有的)

  其实很多时候你去调用一个模块的功能时会遇到单下划线开头的(socket._socket,sys._home,sys._clear_type_cache),这些都是私有的,原则上是供内部调用的,作为外部的你,惠乐彩票注册一意孤行也是可以用的,只不过显得稍微傻逼一点点

  二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

  实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

  接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”这在程序设计上,叫做归一化。

  归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。

  在python中根本就没有一个叫做interface的关键字,上面的代码只是看起来像接口,惠乐彩票注册其实并没有起到接口的作用,子类完全可以不用去实现接口 ,如果非要去模仿接口的概念,可以借助第三方模块:

  这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。

  归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。

  比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。

  再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,惠乐彩票注册操作手法(函数调用)都一样

  与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

  如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。

  比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子。。。。。。你永远无法吃到一个叫做水果的东西。

  从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。

  从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的,即将揭晓答案

  抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

  抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

  在你编写代码解决实际问题的时候,经常能找到一些已有的类,这些类可以帮你实现大部分功能,但不是全部。这时该怎么办?

  对这个已有的类进行修改,但这么做,会使代码变的更加复杂,一不小心就可能破坏原来类的可用的功能。惠乐彩票注册

  类的继承就是可以从一个已有的类中衍生出以个新的类,这个新的类可以不需要再做任何代码的复制重写,就可以拥有原有类的所有属性和方法。

  并且你也可以对这个新的类进行添加新属性和你需要的新方法;甚至把原来类的方法进行重写,即重写实现,并不改变原来方法的名称,这种重写方法,我们习惯称为覆盖方法,下面会一一介绍。

  具体实现的方法就是,在定义新类时,在类的名称后面的小括号中写入要继承的父类的名称即可

  比如说,汽车(Car),自行车(Bicycle)的共性,大部分都是有品牌、出厂日期等属性(变量)的,都可以行驶(方法)。

  这些都是属于车(Vehicle)这个类的属性和方法。下面我们就来演示一下如何实现继承的。

  有很多人可能会把二者混为一谈,然后就会容易乱,甚至懵逼。惠乐彩票注册其实只要分开看,就会很明朗

  多态就是一类事物有多种形态的表现形式。(一个抽象类有多个子类,因而多态的概念依赖于继承,就像上面的例子一样)

  多态性就是在现实生活中具有不同功能的多个事物(对象),也就是每个对象去实现的方法不一样,而对这些功能的叫法,即名称是一样的,比如自行和汽车都能行驶,但是自行车是通过人力为驱动力,2个轮子去行驶;而汽车是使用发动机为驱动力,至少4个轮去行驶(不要给我提摩托车!!!)。

  再比如,人都会说话,但是,中国人说的是普通话,而美国人和英国人说的英语;但这并不能妨碍他们同一种语言之间的正常交流,都叫说话。

  多态性在面向对象编程(OOP)中指的是不同的对象可以使用相同的函数名,但这些函数体却不一样,去实现的方法也自然不一样了;这样就可以用一个函数名调用不同内容的函数,从而去实现不同的方法。

  在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

  如下图总所实现的一样,字符串、列表、和元组都有一样的方法名称 __len__() 但是内部是实现一定不同。

  其实大家从上面多态性的例子可以看出,我们并没有增加什么新的知识,也就是说python本身就是支持多态性的,这么做的好处是什么呢?

  以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(obj)

  通过继承Vehicle类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

  如果你想创建的子类在大多数情况下的行为都和父类相似的话,使用基础是非常不错的选择。

  它们之间的关系是属于的关系。但有些时候是有组合 (composition)更加符合现实的逻辑。比如 x 含有 y ,他们之间是 has-a 的关系。

  汽车是(属于)车的一种(is-a),它有(含有)四个轮子(has-a),轮子是汽车的组成部分,但不是汽车的一种。

  对象本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方。


电话:400-888-8788 联系人:扬州瑞吉输送设备 公司主营:输送机|斗式提升机|提升机-扬州瑞吉输送机械设备有限公司-输送机
版权所有:Copyright © 2002-2020 DEDECMS. 惠乐彩票 版权所有有限公司 《中华人民共和国信息产业部备案许可证》
Copyright @ 2017  # All Right Reserved  网站管理