zoukankan      html  css  js  c++  java
  • python中的类和对象

      我们常说人以群分,物以类聚,即根据特征去划分,这其实就是类的思想。在编写类时,我们会定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可以根据需要赋予每个对象独特的个性。下面我们就来具体了解一下什么是类和对象。

    1、类与对象的语法规范

    关键字:class

    语法如下:

     规范:

    • 类名的命名规范:大驼峰命名,即每个单词的首字母大写
    • 类名需要做到见名知意,提高代码的可读性

    2、编写第一个类

      我们在动画片中都看到过超人,回想一下超人的特征:高大、英俊、潇洒、有超能力、能上天入地、保护人民,保护地球、惩治罪犯......我们可以把具有这类特征的人,都归纳到超人类,然后把这些特征转换成python里面的类。

     

     上述就是我们写的超人类,只要是属于这个类的人都具有这些特征,都有这些特殊的技能。

    3、类当中的属性

    类当中的属性包括类属性和实例属性:

    • 类属性:这个类的特征、这个群体的特征,别的类(别的群体)可能不具备,类属性可以被类和实例获取;
    • 实例属性:这个个体的特征,类当中的其他成员可能不具备,实例属性只能被实例获取。

    1)类属性

    在学习属性的调用之前,我们先来学习创建实例,创建实例我们有时候也叫创建对象,其语法如下:

     根据前面我们定义的超人类,我们创建一个实例如下:

     我们通过这个实例去调用我们在前面超人类当中定义的类属性:

     那么,类属性能不能通过类去调用呢,当然是可以的呀,因为类属性本身就是这个类具备的属性,当然能够通过类去调用了:

    在上面,我们调用的类属性都是在类里面定义的,即先天具有的,其实,类属性也可以在后天进行定义,示范代码如下:

     2)实例属性

    在前面我们介绍了实例属性的概念,了解到实例属性只能被实例调用,不能被类进行调用,下面我们将通过一些具体的代码为大家详细的介绍实例属性。

    实例属性的定义:

     在上面的代码中,我们为person1 定义了两个实例属性,即 hobby 和 eye,那么如果我们现在通过 person2 去调用这两个实例属性是否可以呢,我们来写一段示范代码看一下:

     运行这段代码,结果如下:

     为什么会报错呢,我们不妨回忆一下实例属性的定义,实例属性是类中某一个个体的属性,其他个体不一定具备,而我们在前面定义的时候只是给 person1 定义了 hobby 和 eye 属性,person2并没有这些属性,调用时当然会报错了。

    那么,我们再来思考一下,实例属性能不能通过类来进行调用呢,我们来看一下示范代码:

     运行后的结果是:

     其实,根据实例属性的定义我们已经清楚的预料到了代码会报错了,实例属性只是某一个个体具备的属性,类不一定具备,那么通过类去调用当然会报错了。

     4、类当中的方法

     类当中的方法表示类、对象的行为,方法的本质是函数,只是将函数放在了类当中,我们将放在类里面的函数称之为方法。类当中的方法主要包括:类方法、实例方法、静态方法三种,下面我们将通过一段示范代码为大家讲解这三种方法的区别以及相互调用。

    • 实例方法:实例方法的第一个参数规定是 self,用来表示这个实例本身,实例方法只能被实例调用,不能被类调用;
    • 类方法:在实例方法的基础上,类方法需要在方法前添加@classmethod,表示这是一个类方法,同时需要将 self 改为 cls,用来表示这个类本身。类方法可以被类和实例调用;
    • 静态方法:静态方法是为了方便管理放在类里面的普通函数,静态方法需要在方法上面加上 @staticmethod,表示这是一个静态方法,静态方法不需要使用self、cls作为默认参数,静态函数可以被类、实例调用。

    示范代码如下:

    下面我们再写一个例子,来说明三种方法的调用,示范代码如下:

     

     在类定义的过程中,我们常常会遇到方法之间调用的情况,现在我们通过一段示范代码来说明类定义过程中方法的互相定义,示范代码如下:

     

     最后,我们补充一下实例方法之间的互相调用,示范代码如下:

     5、类的初始化函数__init__()

    我们改写前面定义的超人类,引入初始化函数:

     引入初始化函数后,我们在创建实例的时候需要传入对应的参数,示范代码如下:

     需要我们注意的是,如果在类里面使用了__init__()函数,那么在创建实例的时候传入的参数一定要与__init__中的参数保持一致,而且,在__init__()函数中,必须将传入的参数设置成实例属性才能被访问到。

    5、类的继承

    学习了类之后,我们能够很好的将代码和数据分离开来,有了基本的封装思想。接下来我们将进一步学习类的继承,让我们对类嗯对使用更加灵活。

    1)类继承的简单用法

    我们首先来了解最传统的类的继承,即子类直接继承父类所有的方法和属性,不做任何改动,比如我们现在定义一个父类软件测试工程师类:SoftwareTestEnginner,具体的代码如下所示:

     我们现在创建父类的实例并进行调用:

     运行的结果如下:

     现在我们写一个子类去继承父类的方法和属性,我们将这个类命名为中级测试工程师,示范代码如下:

     创建子类的实例并调用父类的方法:

     运行代码后的结果如下:

     这就是最简单的类的继承的方法,子类不需要做任何事情,就可以调用父类的所有属性和方法。

    2)类继承的重写和扩展

      我们可以编写一个类什么都不做,直接继承父类的所有属性和方法,且能够直接调用父类的所有属性和方法,但是这显然不能满足我们的需求,所以我们还要进一步去学习类的其他特性,即重写和扩展,我们先来了解一下类继承的重写。

    (1)重写

      重写是对继承过来的父类的方法去进行重写,因为有些方法继承过来后,功能可能不符合我们的需求,这时我们就要去进行重写,比如说我们在中级测试工程师类中来改写basic_skill函数,示范代码如下所示:

     

     我们创建实例来进行调用:

     运行后的结果如下图所示:

     通过上述代码,我们可以得到下面两个总结点:

    • 重写basic_skill 后,子类调用的是重写后的basic_skill函数;
    • 没有重写的salary函数,子类可以正常调用。

    (2)扩展

      重写只是针对从父类继承过来的方法进行修改,但是实际上,任何类都会有自己的新特性。我们依然使用上面的例子来进行说明,对于中级测试工程师来说,我们除了要具备初级测试工程师基本的点点点,中级测试工程师还需要具备一些其他父类不具备的功能,我们编写示范代码如下所示:

      我们创建实例来进行调用:

     运行代码后,结果如下图所示:

     通过上述代码,我们可以得到如下结论:

    • 子类可以直接调用父类中的属性值:self.name
    • 子类可以重写父类的方法:basic_skill()
    • 子类可以扩展一些父类没有的方法:auto_skill()

    3)类的超继承

      类继承还有另外一个特殊用法,就是超继承。超继承其实也是类方法重写的另一种表现,他实现的功能要比简单的重写更多一些。用直白的语言来进行描述:超继承既要有父类的特性又要有子类的新特性,接下来我们仍然使用上面的例子来说明超继承的用法,示范代码如下:

     创建实例并进行调用:

     运行之后,结果如下图所示:

     总结一下,超继承既可以有父类方法的特性,又可以有子类拓展的新特性,可以说是类方法重写与扩展的完美结合体。在超继承中,我们要注意 super 关键字的用法,如果父类的方法中有参数传入,在调用的时候也要传入对应的参数。

     4)类的多重继承

    (1)类的多重继承--类方法不同

      python中的类继承还有一个特点,就是可以继承多个类,由于多重继承在自动化测试当中用的不是很多,这里我们只是举一个简单的例子,我们编写两个类,类A和类B,类C同时继承类A和类B,示范代码如下:

     创建实例并进行方法的调用,结果如下:

     运行结果如下:

     子类C继承了父类A和B中所有的方法,我们调用的时候,就直接去父类里面取方法进行调用即可。

    (2)类的多继承--类方法相同

    在(1)的基础上,我们重新编写两个类,类A和类B,类C同时继承类A和类B,且类A和类B中有同名的函数,如下所示:

     创建实例并进行调用:

     运行结果如下所示:

     我们注意到子类C调用的全部都是父类B的方法,这就是多继承的另一个特点:顺序继承,当出现同名方法的时候,会按照顺序优先调用前面父类的同名方法。

    这时,我们调换一下子类C的继承顺序:

     再次创建实例并调用方法:

     运行结果如下:

     所以大家用多继承的时候或者是遇到多继承的一些用法的时候,就一定要注意继承的顺序,但是多继承的特点不止这一个,这里只是简单的介绍了其中的两种情况,有兴趣的大家可以自行扩展。

    6、属性的动态设置

    1)动态获取属性

    为了后面的演示,我们先定义一个类,示范代码如下:

     创建实例并获取实例的number属性:

     现在我们为大家演示使用内置函数getattr()动态获取属性的方法,分为三种情况,我们将为大家分别演示:

    动态获取已存在的属性,示范代码如下:

     动态获取不存在的属性,示范代码如下:

     动态获取不存在的属性,设置默认值。当没有该属性的时候,不会报错,而是返回默认值。

    动态获取属性名存储在变量中的属性,示范代码如下:

     2)动态设置属性

    setattr()用于设置属性值,该属性不一定是存在的,示范代码如下:

  • 相关阅读:
    kali linux 2019.1 替换burpsuite pro 1.7.37
    java反序列化漏洞实战
    我是一个997程序员
    清晨小悟
    vue webpack配置Error
    USSD 杂记
    WingMoney APP逆向,实现自动话费充值
    保持空杯心态
    解决python在命令行中运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"
    【转】Mac find 去除 “Permission denied” 信息的方法
  • 原文地址:https://www.cnblogs.com/Cactus-xiaot/p/12902933.html
Copyright © 2011-2022 走看看