前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

作者头像
清菡
发布2020-12-02 17:06:48
1.5K0
发布2020-12-02 17:06:48
举报
文章被收录于专栏:清菡软件测试清菡软件测试

文章总览图

面向对象编程是最有效的软件编写方法之一。在面向对象编程中,编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。

根据类来创建对象被称为实例化。

一,创建和使用类

使用类几乎可以模拟任何东西。

1.创建类

根据Dog类创建的每个实例都将存储名字和年龄。

根据约定,在Python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。

1.1方法__init__()

类中的函数称为方法。有关函数的一切都适用于方法。唯一重要的差别是调用方法的方式。

这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。

方法__init__()定义中,形参self必不可少,还必须位于其它形参的前面。Python调用这个__init__()方法来创建实例时,将自动传入实参self。

每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

例如创建Dog()实例时,Python将调用Dog类的方法__init__()。通过实参向Dog()传递名字和年龄。self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。

定义的两个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用。

例如,通过类的任何实例来访问这些变量。self.name = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量称为属性。

Dog类还定义了其它2个方法:sit()和roll_over()。由于这些方法不需要额外的信息,如名字,年龄,所以它们只有一个形参self。后面创建的实例能够访问这些方法。

1.2根据类创建实例

可将类视为有关如何创建实例的说明。Dog类是一系列说明,让Python知道如何创建表示特定小狗的实例。

Python使用实参'jack'和4调用Dog类中的方法__init__()。方法__init__()创建一个表示特定小狗的示例。使用我们提供的值来设置属性name和age。方法__init__()并未显示地包含return语句,但Python自动返回一个表示这条小狗的实例。我们将这个实例存储在变量my_dog中。

命名约定很有用,通常可以认为首字母大写的名称(如Dog)指的是类,而小写的名称(如my_dog)指的是根据类创建的实例。

输出:

1.2.1访问属性

要访问实例的属性,可使用句点表示法。

句点表示法在Python中常用,这种语法演示了Python如何获悉属性的值。Python先找到实例my_dog,再查找与这个实例相关联的属性name。在Dog类中引用这个属性时,使用的时self.name。

1.2.2调用方法

根据Dog类创建实例后,就可以使用句点表示法来调用Dog类中定义的任何方法。

要调用方法,可指定实例的名称(这里是my_dog)和要调用的方法,并用句点分隔它们。

输出:

1.2.3创建多个实例

按需求根据类创建任意数量的实例。

输出:

每条小狗都是一个独立的实例,有自己的一组属性。就算给第二条小狗指定同样的名字和年龄,Python依然会根据Dog类创建另一个实例。

输出:

二,使用类和实例

直接修改实例的属性,也可以编写方法以特定的方式进行修改。

1.给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法__init__()内指定这种初始值是可以的。可以这样设置属性,不需要再把这个变量添加进形参中。

当Python调用方法__init__()来创建新实例时,将像前一个示例一样以属性的方式存储制造商,型号,生产年份。Python创建一个名为odometer_reading的属性,并将其初始值设置为0。定义了一个名为read_odometer()的方法,获得汽车的里程。

输出:

2.修改属性的值

以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。

2.1直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接访问它。

我们使用句点表示法来直接访问并设置汽车的属性odometer_reading。这行代码让Python在实例my_new_car中找到属性odometer_reading,并将该属性的值设置为23。

有时候需要像这样直接访问属性,其它时候需要编写对属性进行更新的方法。

输出:

2.2通过方法修改属性的值

如果有替你更新属性的方法,就无需直接访问属性,而可将值传递给一个方法,由它在内部进行更新。

添加方法update_odometer()。这个方法接受一个里程值,并将其存储到self.odometer_reading中。我们调用了update_odometer(),并向它提供了实参23(该实参对应于方法定义中的形参mileage)。它将里程表读数设置为

23。而方法read_odometer()打印该读数。

输出:

2.3通过方法对属性的值进行递增

需要将属性值递增特定的量,而不是将其设置为全新的值。修改这个方法,以禁止增量为负值,从而防止有人利用它来回拨里程表。

可以使用类似于上面的方法来控制用户修改属性值(如里程表读数)的方式,但能够访问程序的人都可以通过直接访问属性来将里程表修改为任何值。

输出:

三,继承

编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法。原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

1.子类的方法__init__()

创建子类的实例时,Python需要完成的任务是给父类的所有属性赋值。子类的方法__init__()需要父类的帮助。

输出:

创建子类时,父类必须包含在当前文件夹中,且位于子类前面。定义了子类ElectricCar。定义子类时,必须在括号内指定父类的名称。方法__init__()接受创建Car实例所需的信息。

super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超类,名称super因此得名。

2.重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。可在子类中定义一个这样的方法,即它与要重写的父类方法同名。Python将不会考虑这个父类方法,而只是关注你在子类中定义的相应方法。

错误代码:

输出:

正确代码:

方法1:

输出:

方法2:

输出:

错误分析:创建的类,有构造器:__init__()。调用方法,赋值实例,输出的时候,方法中没有print或者return。继承的时候就没有值,就显示None。return和print都是输出,return是直接把值从类里抛出来,这个值无形的存在,继承的时候被调用,就会打印出来。

构造器:__init__()

原理:方法创建对象时,调用Python构造器和new方法,构造器在创建对象的时候在内存中创建一个区域,将实例属性加载给这个对象。这就是init构造器初始化了。这个对象要拿出来这个属性,就要return或者print打印出来。

3.将实例用作属性

使用代码模拟实物时,自己给类添加的细节越来越多。属性和方法清单及文件都越来越长。这种情况下,需要将类的一部分作为一个独立的类提取出来。可将大型类拆分成多个协同工作的小类。

不断给ElectricCar类添加细节时,有很多包含汽车电瓶的属性和方法。将这些属性和方法提取出来,放到另一个名为Battery的类中,并将一个Battery实例用作ElectricCar类的一个属性。

添加一个名为self.battery的属性,这行代码让Python创建一个新的Battery实例,该实例存储在属性self.battery中。每当方法__init__()被调用时,都将执行该操作。因此现在每个ElectricCar实例都包含一个自动创建的Battery实例。

Python在实例my_tesla中查找属性battery,并对存储在该属性中的Battery实例调用方法describe_battery()。

4.模拟实物

使用代码来表示实物。

四,导入类

为了让文件整洁,Python允许你将类存储在模块中,然后再主程序中导入所需的模块。

1.导入单个类

先创建Car类。

在其中导入ElectricCar类并创建其实例。

输出:

2.从一个模块中导入多个类

根据需要在程序文件中导入任意数量的类。一个模块中导入多个类时,用逗号分隔了各个类。导入必要的类后,就可根据需要创建每个类的任意数量的实例。

输出:

3.导入整个模块

导入了整个electric_car模块。使用语法module_name.class_name访问需要的类。

输出:

4.在一个模块中导入另一个模块

需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,可能会发现一个模块中的类依赖于另一个模块中的类。在这种情况下,可在前一个模块中导入必要的类。

五,Python标准库

Python标准库是一组模块,安装的Python都包含它。可使用其它程序员编写好的模块了。可使用标准库中的任何函数和类,为此只需在程序开头包含一条简单的import语句。

字典能将信息关联起来,但字典不记录键-值对的顺序。要创建字典并记录其中的键-值对的添加顺序,可使用模块collections中的OrderedDict类。OrderedDict实例的行为几乎与字典相同,区别只在于记录了键-值对的添加顺序。

输出:

六,类编码风格

类命名应采用驼峰命名法。类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。

对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要描述类的功能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档