软件测试基础十五(python 面向对象)

面向对象

一、面向对象三大特点

1. 封装(Encapsulation)

    • 定义和目的:封装是将数据(属性)和操作这些数据的方法(行为)包装在一个类中,对外隐藏内部的实现细节,只提供一些公共的接口来访问和操作数据。
    • 好处
      • 提高代码的安全性,防止外部直接访问和修改内部数据,避免错误的修改导致程序出现问题。
      • 提高代码的可维护性,内部实现的改变不会影响外部代码的使用,只要公共接口保持不变。
    • 示例
class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # 使用双下划线开头表示私有属性

    def deposit(self, amount):
        self.__balance += amount

    def withdraw(self, amount):
        if self.__balance >= amount:
            self.__balance -= amount
        else:
            print("Insufficient balance.")

    def get_balance(self):
        return self.__balance
    • 在这个例子中,BankAccount类封装了账户余额这个数据,并通过公共方法depositwithdrawget_balance来操作余额,外部无法直接访问和修改私有属性__balance

2. 继承(Inheritance)

    • 定义和目的:继承是一种创建新类的方式,新类(子类)可以继承现有类(父类)的属性和方法,并且可以添加新的属性和方法或者修改父类的方法。
    • 好处
      • 代码复用,避免重复编写相同的代码。
      • 建立类之间的层次关系,使代码更具结构性和可维护性。
    • 示例
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"
    • 在这个例子中,DogCat类继承自Animal类,继承了name属性和__init__构造方法,并且重写了speak方法。

3. 多态(Polymorphism)

    • 定义和目的:多态是指同一操作作用于不同的对象可以有不同的表现形式。在 Python 中,多态主要通过方法重写和方法重载(虽然 Python 不严格支持方法重载,但可以通过默认参数等方式实现类似效果)来实现。
    • 好处
      • 增加代码的灵活性和可扩展性,使得程序可以根据不同的对象类型自动选择合适的方法执行。
      • 提高代码的可维护性,当需要添加新的对象类型时,只需要实现相应的方法,而不需要修改现有的代码。
    • 示例
class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

def make_animal_speak(animal):
    print(animal.speak())

dog = Dog()
cat = Cat()
make_animal_speak(dog)  # 输出 "Woof!"
make_animal_speak(cat)  # 输出 "Meow!"
    • 在这个例子中,make_animal_speak函数接受一个Animal类型的参数,它可以根据传入的不同对象类型自动调用相应的speak方法,体现了多态性。

二、类属性和类方法

1. 类属性

    • 定义:类属性是属于类本身的属性,所有的实例对象共享同一个类属性值。类属性在类中直接定义,不在任何方法内部。
    • 示例
class Circle:
    pi = 3.14  # 类属性

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return Circle.pi * self.radius * self.radius
    • 在这个例子中,piCircle类的类属性,用于计算圆的面积。

2. 类方法

    • 定义:类方法是与类相关的方法,而不是与实例相关的方法。类方法使用@classmethod装饰器来定义,第一个参数通常是cls,代表类本身。
    • 示例
class Circle:
    pi = 3.14

    def __init__(self, radius):
        self.radius = radius

    @classmethod
    def from_diameter(cls, diameter):
        print(f"Received diameter: {diameter}")
        radius = int(diameter / 2)
        print(f"Calculated radius: {radius}")
        return cls(radius)

    def area(self):
        return Circle.pi * self.radius * self.radius


if __name__ == "__main__":
    a = Circle(2).area()
    print(a)

    b = Circle.from_diameter(4).area()

    print(b)
    • 在这个例子中,from_diameter是一个类方法,它可以根据圆的直径创建一个Circle对象。

3. 类方法的特点与作用

3.1. 访问类属性

类方法可以直接访问类的属性,而不需要通过实例对象。这使得类方法在处理与类相关的全局状态或配置时非常有用。

例如:

class Configuration:
    default_value = 10

    @classmethod
    def get_default_value(cls):
        return cls.default_value
    • 在这个例子中,get_default_value类方法可以直接访问类属性default_value,而无需创建类的实例。
3.2. 修改类属性

类方法也可以修改类属性的值,但要注意这种修改会影响所有的实例对象和后续创建的实例。

例如:

class Counter:
    count = 0

    @classmethod
    def increment(cls):
        cls.count += 1

Counter.increment()
print(Counter.count)  # 输出 1
    • 这里的increment类方法可以增加类属性count的值。
3.3. 作为工厂方法
    • 类方法可以用作工厂方法,根据不同的输入创建不同类型的实例对象。
    • 例如:
class Shape:
    @classmethod
    def create_square(cls, side_length):
        return cls(side_length, side_length)

    def __init__(self, length, width):
        self.length = length
        self.width = width

class Rectangle(Shape):
    pass

square = Rectangle.create_square(5)
print(square.length, square.width)  # 输出 5 5
    • 在这个例子中,create_square类方法可以创建一个正方形的Rectangle对象。
3.4. 独立于实例状态

类方法不依赖于特定的实例状态,因此它们可以在不创建实例的情况下被调用。这使得类方法在一些需要全局操作或共享逻辑的情况下非常有用。

例如,在一个日志记录类中,可以使用类方法来记录与整个类相关的事件,而不是特定的实例事件。

三、类方法与普通方法的区别

1. 定义和语法

  1. 普通方法(实例方法)
    • 定义在类中,第一个参数通常是self,代表类的实例对象。
    • 语法:def method_name(self, arg1, arg2,...):
  1. 类方法
    • 使用@classmethod装饰器定义,第一个参数通常是cls,代表类本身。
    • 语法:@classmethod def class_method(cls, arg1, arg2,...):

2. 调用方式

  1. 普通方法
    • 需要通过类的实例对象来调用。例如:obj = MyClass(),然后obj.method_name(arg1, arg2,...)
  1. 类方法
    • 可以通过类直接调用,也可以通过实例对象调用,但通常建议通过类来调用。例如:MyClass.class_method(arg1, arg2,...)obj.class_method(arg1, arg2,...)

3. 作用和功能

  1. 普通方法
    • 主要用于操作实例对象的状态和行为,通常访问和修改实例属性。
    • 每个实例对象都有自己独立的普通方法副本,不同实例之间的普通方法操作不相互影响。
  1. 类方法
    • 通常用于操作类的状态和行为,比如访问和修改类属性、作为工厂方法创建类的实例等。
    • 类方法对所有实例对象共享,对类属性的修改会影响所有实例。

4. 访问范围

  1. 普通方法
    • 可以直接访问实例属性(通过self),也可以通过类名访问类属性(但不建议这样做)。
  1. 类方法
    • 可以直接访问类属性(通过cls),但不能直接访问实例属性。

例如:

class MyClass:
    class_attribute = 0

    def __init__(self, instance_attribute):
        self.instance_attribute = instance_attribute

    def instance_method(self):
        # 可以访问实例属性和类属性
        print(self.instance_attribute)
        print(MyClass.class_attribute)

    @classmethod
    def class_method(cls):
        # 可以访问类属性,但不能直接访问实例属性
        print(cls.class_attribute)
        # print(self.instance_attribute)  # 会报错

obj = MyClass(10)
obj.instance_method()
MyClass.class_method()

综上所述,类方法和普通方法在定义、调用方式、作用和访问范围等方面都有明显的区别,根据具体的需求选择合适的方法类型可以使代码更加清晰和高效。

四、私有属性和私有方法

1. 定义私有属性

  1. 语法
    • 在类的构造方法(__init__)中,使用双下划线开头的变量名来定义私有属性。
    • 例如:
class MyClass:
    def __init__(self):
        self.__private_attribute = 10
    • 这里__private_attribute就是一个私有属性。
  1. 访问限制
    • 私有属性只能在类的内部被访问和修改。在类的外部,直接尝试访问私有属性会引发错误。
    • 例如:
obj = MyClass()
print(obj.__private_attribute)  # 会报错

2. 定义私有方法

  1. 语法
    • 与私有属性类似,在类中定义方法时,使用双下划线开头的方法名来定义私有方法。
    • 例如:
class MyClass:
    def __init__(self):
        self.__private_attribute = 10

    def __private_method(self):
        return self.__private_attribute * 2
    • 这里__private_method就是一个私有方法。
  1. 访问限制
    • 私有方法只能在类的内部被调用。在类的外部,直接尝试调用私有方法会引发错误。
    • 例如:
obj = MyClass()
obj.__private_method()  # 会报错

3. 使用私有属性和私有方法的注意事项

  1. 虽然 Python 中的私有属性和私有方法并不是真正的私有,它们可以通过特定的方式被访问和调用,但这是一种约定俗成的规范,应该尽量遵守,以确保代码的封装性和安全性。
  2. 如果需要在类的外部访问私有属性或调用私有方法,可以通过在类中定义公共方法来间接实现。例如,可以定义一个公共方法来返回私有属性的值,或者调用私有方法并返回结果。

以下是一个示例,展示了如何通过公共方法访问私有属性和调用私有方法:

class MyClass:
    def __init__(self):
        self.__private_attribute = 10

    def __private_method(self):
        return self.__private_attribute * 2

    def get_private_attribute(self):
        return self.__private_attribute

    def call_private_method(self):
        return self.__private_method()

obj = MyClass()
print(obj.get_private_attribute())  # 输出 10
print(obj.call_private_method())  # 输出 20

在这个例子中,通过公共方法get_private_attributecall_private_method分别访问了私有属性和调用了私有方法。

五、静态方法

1. 定义

静态方法是与类或实例都没有直接关系的方法,它只是一个普通的函数,被放在类中是为了组织代码的逻辑。静态方法使用@staticmethod装饰器来定义,不接受selfcls参数。

2. 示例:

class MathUtils:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def subtract(a, b):
        return a - b
  • 在这个例子中,MathUtils类中的addsubtract方法是静态方法,它们只是普通的数学运算函数,与类或实例没有直接关系。

总之,封装、继承和多态是面向对象编程的重要特点,它们可以提高代码的可维护性、可扩展性和可复用性。类属性、类方法和静态方法则为组织和管理代码提供了更多的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

斗破QT编程入门系列之二:GUI应用程序设计基础:UI文件(四星斗师)

斗破Qt目录: 斗破Qt编程入门系列之前言:认识Qt:Qt的获取与安装(四星斗师) 斗破QT编程入门系列之一:认识Qt:初步使用(四星斗师) 斗破QT编程入门系列之二:认识…

ffmpeg命令

1. 修改视频的数据速率 ffmpeg.exe -i video.mp4 -r 30 -c:v libx264 -b:v 1500k output.mp42. mp4与h264互相转换 ffmpeg.exe -i a.mp4 -vcodec h264 output.h264 ffmpeg.exe -i output.h264 -vcodec mpeg4 output.mp4

前端三件套-css

一、元素选择器 元素选择器&#xff1a;利用标签名称。p,h1-h6...... 行内样式&#xff08;内联样式&#xff09;&#xff1a;例如<p style"color:red;font-size:50px"> id选择器&#xff1a;针对某一个特定的标签来使用。以#定义。 class&#xff08;类&a…

c++设计模式demo

模式设计原则 依赖倒置原则 ⾼层模块不应该依赖低层模块&#xff0c;⼆者都应该依赖抽象 &#xff1b; 抽象不应该依赖具体实现&#xff0c;具体实现应该依赖于抽象&#xff1b; ⾃动驾驶系统公司是⾼层&#xff0c;汽⻋⽣产⼚商为低层&#xff0c;它们不应该互相依赖&#x…

操作系统学习笔记-4.1文件管理

文章目录 文件的逻辑结构1. 顺序结构特点应用场景示例 2. 索引结构特点应用场景示例 3. 链接结构特点应用场景示例 总结 文件目录文件的物理结构1. 连续分配&#xff08;Contiguous Allocation&#xff09;2. 链接分配&#xff08;Linked Allocation&#xff09;隐式链接 3. 索…

ES文档:文档操作_doc(7.9.2)

用心记录技术&#xff0c;走心分享&#xff0c;始于后端&#xff0c;不止于后端&#xff0c;励志成为一名优秀的全栈架构师&#xff0c;真正的实现码中致富。 ElasticSearch文档的操作&#xff1b; 添加文档 新建一个索引 goboy-blog&#xff0c;如果添加文档索引不存在则会创…

深入解析 WinForms MVVM 模式中的事件驱动与数据驱动

前言 在传统的 WinForms 开发中&#xff0c;事件驱动模型&#xff08;Event-Driven Model&#xff09;是核心&#xff0c;它通过控件的事件&#xff08;如点击按钮、改变文本等&#xff09;触发业务逻辑。然而&#xff0c;MVVM 模式引入了数据驱动&#xff08;Data-Driven&…

Python中的 if __name__ == ‘__main__

在Python中&#xff0c;if __name__ __main__: 这行代码有一个特定的用途和含义。为了理解它&#xff0c;我们需要先了解Python中的__name__变量以及Python脚本是如何执行的。 __name__变量 每个Python模块&#xff08;python文件&#xff09;都有一个内置的属性__name__。当…

【系统面试篇】进程与线程类(2)(笔记)——进程调度、中断、异常、用户态、核心态

目录 一、相关面试题 1. 进程的调度算法有哪些&#xff1f; 调度原则 &#xff08;1&#xff09;先来先服务调度算法 &#xff08;2&#xff09;最短作业优先调度算法 &#xff08;3&#xff09;高响应比优先调度算法 &#xff08;4&#xff09;时间片轮转调度算法 &am…

大数据工具 flume 的安装配置与使用 (详细版)

参考网址&#xff1a;Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了 1&#xff0c;上传安装包 安装包链接&#xff1a;文件下载-奶牛快传 Download &#xff5c;CowTransfer 口令&#xff1a;x8bhcg 1&#xff0c;切换盘符到安装目录 cd /opt/moudles 解压文件…

使用uni-app框架开发各种web前端程序

使用uni-app框架开发各种web前端程序是目前非常流程的开发方式&#xff0c;比如开发APP、小程序、H5等等&#xff0c;是一个使用 vue 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到ios&#xff0c;安卓、H5、以及各种小程序&#xff08;微信、支付…

鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)

在鸿蒙ArkTS中&#xff0c;布局容器组件有很多&#xff0c;常见的有&#xff1a;   ⑴ Column&#xff1a;&#xff08;垂直布局容器&#xff09;&#xff1a;用于将子组件垂直排列。   ⑵ Row&#xff1a;&#xff08;水平布局容器&#xff09;&#xff1a;用于将子组件水…

简单介绍一下mvvm mvc mvp以及区别、历史

MVC&#xff08;Model - View - Controller&#xff09; 因MVC架构的灵活性&#xff0c;架构图形式很多&#xff0c;仅供参考 历史&#xff1a; MVC 是最早出现的软件架构模式之一&#xff0c;其历史可以追溯到 20 世纪 70 年代&#xff0c;最初被用于 Smalltalk - 80 环境。…

黑马程序员linux学习【持续更新】

Linux基础 一、Linux简介 1.分类 不同领域的主流操作系统&#xff0c;主要分为下 几类&#xff1a;桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。 桌面操作系统 操作系统特点Windows用户数量最多MacOS操作体验好&#xff0c;办公人士首选Linux用户数…

Vert.x,应用监控 - 全链路跟踪,基于Zipkin

关于Zipkin Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System)&#xff0c;能够收集服务间调用的时序数据&#xff0c;提供调用链路的追踪。Zipkin每一个调用链路通过一个trace id来串联起来&#xff0c;通过trace id&#xff0c;就能够直接定位到这次调…

ENSP作业——园区网

题目 根据上图&#xff0c;可得需求为&#xff1a; 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥&#xff0c;设置SW2为VLAN 20/30的主根桥&#xff0c;且两台交换机互为主备。 3.可以使用super vlan。 4.上层通过静态路由协议完成数据通信过程。 5.AR1作为企…

从壹开始解读Yolov11【源码研读系列】——Data.dataset.py:模型训练数据预处理/YOLO官方数据集类——YOLODataset

【前情回顾】在上一篇文章记录了YOLO源码data目录下的 base.py 文件&#xff0c;其中定义了一个可灵活修改的数据加载处理基类——Class BaseDataset 灵活基类博文地址&#xff1a;https://blog.csdn.net/qq_58718853/article/details/143249295 【实验代码】所有实验代码上传至…

HFSS 3D Layout中Design setting各个选项的解释

从HFSS 3D LAYOUT菜单中&#xff0c;选择Design Settings打开窗口&#xff0c;会有六个选项&#xff1a;DC Extrapolation, Nexxim Options, Export S Parameters, Lossy Dielectrics, HFSS Meshing Method, and HFSS Adaptive Mesh. DC Extrapolation 直流外推 直流外推分为标…

【板栗糖GIS】——如果安装的vscode版本落后了,如何无障碍更新

【板栗糖GIS】——如果安装的vscode版本落后了&#xff0c;如何无障碍更新 今天想安装新扩展插件时发现vscode版本有点旧&#xff0c;于是在不影响插件的情况下更新。 打开vscode软件&#xff0c;点击设置检查更新&#xff0c;如果有需要更新的直接安装到原目录&#xff0c;如…

数字化转型必看!华为数字化最全合集(192页PDF限免下载 )

今天给大家整理了6份关于华为数字化的资料&#xff0c;共计192页&#xff0c;干货满满&#xff01; 资料已经全部打包&#xff0c;划到文末添加大师兄即可免费下载&#x1f447;&#x1f447;&#x1f447; 一、华为实施数字化转型方法论与实践的业务解读 这份报告是华为实施数…