• 全栈自动化测试之python基础面对对象之类和继承


    前言

    小伙伴们大家好呀,我们都知道学习软件测试需要掌握一门开发语言,python是所有开发语言中比较适合新手学习的一门语言,今天的这篇文章呢主要介绍python面对对象中的类和继承,包括类方法、静态方法、只读属性、继承等。

     

    一、类方法

    1.类方法定义

    使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名一般约定为“cls",通过它来传递类的属性和方法(不能传递实例属性和实例方法),跟实例方法的self用法相似。

    2.类方法的调用

    实例对象和类对象都可以调用

    3.应用场景

    在需要站在类的角度执行某个行为时,那么就可以定义为类方法

    1. class Student:
    2. def __init__(self, name, age):
    3. self.name = name
    4. self.age = age
    5. def student_info(self):
    6. """实例方法"""
    7. print("-----student_info-----")
    8. print('name:{}'.format(self.name))
    9. print('age:{}'.format(self.age))
    10. @classmethod      # 带有@classmethod标志的就是类方法,@xxx 就是装饰器
    11. def class_info(cls): # cls与self的用法一致,self代表的是实例对象本身,cls代表的是类本身
    12. """类方法"""     # 应用场景:需要站在类的角度执行某个行为时,就定义为类方法
    13. print("-----class_info-----")
    14. print('在校学生')
    15. print("cls:", cls)
    16. case = Student('张三', 22)
    17. case.student_info()
    18. case.class_info() # 通过实例对象访问类方法
    19. Student.class_info() # 通过类对象访问类方法

    运行结果:

    1. C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
    2. -----student_info-----
    3. name:张三
    4. age:22
    5. -----class_info-----
    6. 在校学生
    7. cls: <class '__main__.Student'>
    8. -----class_info-----
    9. 在校学生
    10. cls: <class '__main__.Student'>
    11. Process finished with exit code 0

    二、静态方法

    (了解即可,在自动化测试中暂时用不到)

    1.静态方法定义

    使用装饰器@staticmethod装饰,参数随意,不需要“self“和“cls"参数,但是方法体中不能使用类或实例的任何属性和方法

    2.静态方法的调用

    实例对象和类对象都可以调用

    3.应用场景

    用于存放纯逻辑代码,内部不需要引用类或实例的属性和方法

    1. class Student:
    2. def __init__(self, name, age):
    3. self.name = name
    4. self.age = age
    5. def student_info(self):
    6. """实例方法"""
    7. print("-----student_info-----")
    8. print('name:{}'.format(self.name))
    9. print('age:{}'.format(self.age))
    10. @staticmethod # 静态方法不会牵涉到类和实例,里面只存放逻辑代码
    11. def static_move(): # 类和实例都可以调用静态方法
    12. """静态方法"""
    13. print("-----static_info-----")
    14. print('清华大学的学生')
    15. case = Student('张三', 22)
    16. case.student_info()
    17. case.static_move() # 通过实例对象访问静态方法
    18. Student.static_move() # 通过类对象访问静态方法

    运行结果:

    1. C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
    2. -----student_info-----
    3. name:张三
    4. age:22
    5. -----static_info-----
    6. 清华大学的学生
    7. -----static_info-----
    8. 清华大学的学生
    9. Process finished with exit code 0

    三、只读属性

    (了解即可,在自动化测试中暂时用不到)

    1.只读属性定义

    使用装饰器@property装饰,需要一个self参数,即实例对象本身,用于定义一个属性(一般指实例属性),只能读,不能写入

    2.只读属性的调用

    通过实例对象去调用

    3.应用场景

    属性只能读,不可以写入或更改

    1. class Student:
    2. def __init__(self, name, age):
    3. self.name = name
    4. self.age = age
    5. def student_info(self):
    6. """实例方法"""
    7. print("-----student_info-----")
    8. print('name:{}'.format(self.name))
    9. print('age:{}'.format(self.age))
    10. @property
    11. def property(self): # 定义一个只能用,不能改的属性,了解即可
    12. """只读属性"""
    13. print("-----property_info-----")
    14. return 18
    15. case = Student('张三', 22)
    16. case.student_info()
    17. print(case.property) # 通过实例对象访问只读属性

    运行结果:

    1. C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
    2. -----student_info-----
    3. name:张三
    4. age:22
    5. -----property_info-----
    6. 18
    7. Process finished with exit code 0

    四、继承

    所有的类都默认继承自object这个父类(基础类)。那么什么是继承?继承的作用是什么呢?

    1.继承的定义及作用

    • 定义:面对对象编程中有一个很重要的思想叫继承,子类可以通过继承获得父类的属性和方法,被继承的类叫父类(基类),继承的类叫子类
    • 作用:子类可以通过继承获得父类的属性和方法,从而提高开发的效率和代码的复用

    2.调用父类里的方法

    子类的实例对象能访问所有父类的实例方法,不管往上有几层父类都可以访问,但不能往下访问自己的子类

    1. class BasePhone(object):
    2. """定义一个手机基础类"""
    3. def __init__(self, brand, model, price):
    4. self.brand = brand
    5. self.model = model
    6. self.price = price
    7. def phone_func(self):
    8. """手机功能"""
    9. print("这款手机是触屏手机")
    10. print("这款手机是智能手机")
    11. print("这款手机有红外线功能")
    12. print("这款手机有nfc功能")
    13. class HonorPhone(BasePhone):
    14. """继承手机基础类,这是荣耀系列手机,基础功能都有"""
    15. def phone_info(self):
    16. print("您的手机品牌是{},型号{},价格{}".format(self.brand,self.model,self.price))
    17. def honor_func(self):
    18. """荣耀功能"""
    19. print("这款手机支持HiFi")
    20. print("这款手机可以玩mobile游戏")
    21. print("这款手机支持应用分屏")
    22. class HonorPorPhone(HonorPhone):
    23. """继承手机基础类,这是荣耀pro系列手机,基础功能和荣耀功能都有"""
    24. def new_func(self):
    25. """新功能"""
    26. print("这款手机支持30倍变焦")
    27. # 实例化对象,继承后有最上层父类的初始化方法,需要传三个参数
    28. phone1 = HonorPorPhone('荣耀手机', 'Honor20pro', '¥3599')
    29. phone1.phone_info()
    30. phone1.phone_func() # 调用最上层父类的方法(子类创建出来的对象能访问所有父类的实例方法)
    31. phone1.honor_func() # 调用父类的方法
    32. phone1.new_func() # 调用自己的方法
    33. phone2 = HonorPhone('荣耀手机', 'Honor20', '¥2999')
    34. # 作为HonorPorPhone类的父类,创建出来的对象不能访问子类(即HonorPorPhone类)的实例方法,不能往下访问
    35. phone2.new_func() # 因此这里运行会报错

    运行结果:

    1. C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
    2. 您的手机品牌是荣耀手机,型号Honor20pro,价格¥3599
    3. 这款手机是触屏手机
    4. 这款手机是智能手机
    5. 这款手机有红外线功能
    6. 这款手机有nfc功能
    7. 这款手机支持HiFi
    8. 这款手机可以玩mobile游戏
    9. 这款手机支持应用分屏
    10. 这款手机支持30倍变焦
    11. Traceback (most recent call last):
    12. File "D:/learn/python18_http_request/exercise/test.py", line 62, in <module>
    13. phone2.new_func()
    14. AttributeError: 'HonorPhone' object has no attribute 'new_func'
    15. Process finished with exit code 1

    调用父类的属性也是如此,这里就不再举例了。

    3.子类中调用重名的父类方法

    子类不仅仅可以调用父类的方法,也可以重写父类的方法再重新调用,简单来说在子类中写一个与父类同名的方法,并且也沿用父类方法里的代码,只是在父类方法基础上再增加一些代码,子类重写了父类的方法后,再调用父类方法的方式有两种:

    • 方式一:父类名.方法名(self)
    • 方式二:super().方法名()
    1. # 继承:在python3的继承中,所有的类都默认继承自object这个父类(基础类)
    2. # 两种写法都默认继承object类
    3. # class Phone:
    4. # pass
    5. #
    6. # class BasePhone(object):
    7. # pass
    8. class BasePhone(object):
    9. """定义一个手机基础类"""
    10. def __init__(self, brand, model, price):
    11. self.brand = brand
    12. self.model = model
    13. self.price = price
    14. def phone_func(self):
    15. """手机功能"""
    16. print("这款手机是触屏手机")
    17. print("这款手机是智能手机")
    18. print("这款手机有红外线功能")
    19. print("这款手机有nfc功能")
    20. class HonorPhone(BasePhone):
    21. """继承手机基础类,这是荣耀系列手机,基础功能都有"""
    22. def phone_info(self):
    23. print("您的手机品牌是{},型号{},价格{}".format(self.brand,self.model,self.price))
    24. def phone_func(self):
    25. """重写父类的手机功能方法,在这基础上增加一个功能"""
    26. print("这款手机有双摄像头")
    27. # BasePhone.phone_func(self) # 重写父类同名方法后,再调用父类的方法 第一种方式
    28. super().phone_func() # 重写父类同名方法后,再调用父类的方法 第二种方式(常用)
    29. def honor_func(self):
    30. """荣耀功能"""
    31. print("这款手机支持HiFi")
    32. print("这款手机可以玩mobile游戏")
    33. print("这款手机支持应用分屏")
    34. class BetaPhone(BasePhone): # 这个类没有重写父类的手机功能方法
    35. """继承手机基础类,这是Beta系列手机,有基础功能"""
    36. def phone_info(self):
    37. print("您的手机品牌是{},型号{},价格{}".format(self.brand,self.model,self.price))
    38. def new_func(self):
    39. """新功能"""
    40. print("这款手机支持30倍变焦")
    41. # 实例化对象,继承后有最上层父类的初始化方法,需要传三个参数
    42. phone1 = HonorPhone('荣耀手机', 'Honor20', '¥2999')
    43. phone1.phone_info()
    44. phone1.phone_func() # 调用父类的方法
    45. phone1.honor_func() # 调用自己的方法
    46. print("-------------分割线------------")
    47. phone2 = BetaPhone('Beta手机', 'Beta8', '¥3299')
    48. phone2.phone_info()
    49. phone2.phone_func()
    50. phone2.new_func()

    运行结果:

    1. C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
    2. 您的手机品牌是荣耀手机,型号Honor20,价格¥2999
    3. 这款手机有双摄像头
    4. 这款手机是触屏手机
    5. 这款手机是智能手机
    6. 这款手机有红外线功能
    7. 这款手机有nfc功能
    8. 这款手机支持HiFi
    9. 这款手机可以玩mobile游戏
    10. 这款手机支持应用分屏
    11. -------------分割线------------
    12. 您的手机品牌是Beta手机,型号Beta8,价格¥3299
    13. 这款手机是触屏手机
    14. 这款手机是智能手机
    15. 这款手机有红外线功能
    16. 这款手机有nfc功能
    17. 这款手机支持30倍变焦
    18. Process finished with exit code 0

    重写父类方法后也可以不再调用父类方法,相当于把重名的方法重新写一遍,如果觉得理解不了,自己多敲几遍,举一反三练习一下吧!

    总结

    今天的文章就到这里了哟,希望可以帮助到正在学习python自动化的小伙伴哟,喜欢的小伙伴不要忘记点赞收藏评论加关注哟。

     

  • 相关阅读:
    极客日报:美团APP被曝连续24小时定位;清华校友吴旻当选IEEE SPS首位华裔女主席;VS Code 1.61发布
    6.19作业
    ORA-01940 无法删除当前已连接的用户之解决方案(脚本)
    利用DownThemAll工具批量下载网页单一链接的数据
    人工智能知识全面讲解:最简单的神经元模型
    计算机网络面试大总结
    程序员写博客如何赚钱「5大盈利方向」
    Flutter 基本概念
    本机配置SSH连接代码仓库
    会员通?会员通!
  • 原文地址:https://blog.csdn.net/qishuzdh/article/details/126293821