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

面向对象

一、面向对象三大特点

1. 封装(Encapsulation)

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

2. 继承(Inheritance)

    • 定义和目的:继承是一种创建新类的方式,新类(子类)可以继承现有类(父类)的属性和方法,并且可以添加新的属性和方法或者修改父类的方法。
    • 好处
      • 代码复用,避免重复编写相同的代码。
      • 建立类之间的层次关系,使代码更具结构性和可维护性。
    • 示例
class Animal:def __init__(self, name):self.name = namedef speak(self):passclass 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):passclass 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 = radiusdef area(self):return Circle.pi * self.radius * self.radius
    • 在这个例子中,piCircle类的类属性,用于计算圆的面积。

2. 类方法

    • 定义:类方法是与类相关的方法,而不是与实例相关的方法。类方法使用@classmethod装饰器来定义,第一个参数通常是cls,代表类本身。
    • 示例
class Circle:pi = 3.14def __init__(self, radius):self.radius = radius@classmethoddef 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.radiusif __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@classmethoddef get_default_value(cls):return cls.default_value
    • 在这个例子中,get_default_value类方法可以直接访问类属性default_value,而无需创建类的实例。
3.2. 修改类属性

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

例如:

class Counter:count = 0@classmethoddef increment(cls):cls.count += 1Counter.increment()
print(Counter.count)  # 输出 1
    • 这里的increment类方法可以增加类属性count的值。
3.3. 作为工厂方法
    • 类方法可以用作工厂方法,根据不同的输入创建不同类型的实例对象。
    • 例如:
class Shape:@classmethoddef create_square(cls, side_length):return cls(side_length, side_length)def __init__(self, length, width):self.length = lengthself.width = widthclass Rectangle(Shape):passsquare = 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 = 0def __init__(self, instance_attribute):self.instance_attribute = instance_attributedef instance_method(self):# 可以访问实例属性和类属性print(self.instance_attribute)print(MyClass.class_attribute)@classmethoddef 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 = 10def __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 = 10def __private_method(self):return self.__private_attribute * 2def get_private_attribute(self):return self.__private_attributedef 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:@staticmethoddef add(a, b):return a + b@staticmethoddef subtract(a, b):return a - b
  • 在这个例子中,MathUtils类中的addsubtract方法是静态方法,它们只是普通的数学运算函数,与类或实例没有直接关系。

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

像狗一样的男人 --- 社保 篇

如果你不想像狗一样的活着,请抛弃幻想,保持学习 一些概念城镇职工社会保险(五险一金)城居保(新农合) 一些概念 社保有两个系统: 城镇职工社会保险 也就是 五险一金。新农合 14年新农合改名叫城…

腾讯云轻量应用服务器最佳实践

引言 轻量应用服务器是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的使用,相比普通云服务器更加简单易用且更贴近应用,提供极简上云体验。那么如何正确地购买、配置、管理轻量应用服务器,以确…

python练习-袭击敌机

$ python -m pip install --user pygame1、画游戏框 class Settings:def __init__(self):self.screen_width 1200self.screen_height 800self.bg_color (230, 230, 230)import sys import pygame from settings import Settingsclass AlienInvasion:def __init__(self):pyg…

windows server2019下载docker拉取redis等镜像并运行项目

一、基本概念 1、windows server 指由微软公司开发的“Windows”系列中的“服务器”版本。这意味着它是基于Windows操作系统的,但专门设计用于服务器环境,而不是普通的桌面或个人用户使用。主要用途包括服务器功能、用户和资源管理、虚拟化等 2、dock…

软件设计师中级 第9章 数据库技术基础

9.1 基本概念 9.1.1 数据库的三级模式结构 数据库系统有三级模式结构,一个数据库可以由多个外模式,只能有一个内模式。 视图对应外模式、基本表对应模式(概念模式)、存储文件对应内模式。 外模式 也称子模式(Subsch…

1.python介绍、安装

python可以做什么? 1.自动化脚本(运维开发、测试开发等) 2.自动化办公 3.web应用程序 4.基于python完成数据计算(生物、化学、物理) 5.基于python开发AI程序 6.完成大数据开发Spark、Flink 想要与计算机交流&am…

一文学会easyexcel导入数据,多sheet页、字典转换【附带源码】

文章目录 前言一、业务流程二、实现1、引入easyexcel、fastjson、lombok包2、创建Json工具类3、创建自定义字典转换注解4、创建字典转换实现类5、创建数据对象类6、创建多sheet页封装对象7、创建Excel导入工具类8、创建测试类 三、接口测试1、启用项目2、使用数据导出的文件&am…

大模型微调技术 --> IA3

IA3 1.摘要 我们引入了一种名为 ( I A ) 3 (IA)^3 (IA)3 (通过抑制和放大内部激活的注入适配器, Infused Adapter by Inhibiting and Amplifying Inner Activations)的新的PEFT方法,该方法通过学习向量缩放激活,在只引入相对少量的新参数的情况下获得更…

Liunx:进程控制

进程终止 三种场景,进程结束结果正确,进程结束不正确,异常终止。 进程的退出码,也就是return,表征着进程运行结果是否正常,return 返回值被父进程接收。return 0表示进程运行结束并且结果正确。他是给用户的…

C++builder中的人工智能(12):了解ELU(Exponential Linear Unit)——人工神经网络中的激活函数

在这篇文章中,我们将解释什么是指数线性单元(ELU),以及如何利用ELU激活函数。通过学习这些知识,你将能够使用C软件创建C应用程序。 我们需要了解哪些关于激活函数的知识? 激活函数(phi()&#…

从0开始学习机器学习--Day19--学习曲线

一般来说,如果一个算法的表现不理想,那么多半是因为出现了欠拟合或过拟合问题,这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题,亦或是二者皆有,这有助于我们精准定位问题所在。 之前,我们发现…

豆包大模型团队开源RLHF框架,破解强化学习训练部署难题

1. 引言 1.1 强化学习 强化学习(Reinforcement Learning, RL)是与监督学习和无监督学习并列的一种机器学习方法,其用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题…

练习LabVIEW第四十三题

学习目标: 模拟红绿灯,红灯亮十秒,绿灯亮五秒,交替,并用波形图将波形显示 开始编写: 前面板 两个指示灯,一个红色,一个绿色,一个波形图; 程序框图 创建…

css:基础

前言 我们之前其实也可以写出一个看起来算是一个网页的网页,为什么我们还要学css? CSS(Cascading Style Sheets)也叫层叠样式表,是负责美化的,我们之前说html就是一个骨架,css就可以用来美化网…

解析 “Cookies Not Marked as HttpOnly” 漏洞

一、引言 在 Web 应用安全领域,Cookies 相关的漏洞一直是备受关注的问题。其中,“Cookies Not Marked as HttpOnly” 漏洞可能会对用户数据安全和网站的正常运行造成潜在威胁。本文将详细介绍这个漏洞,包括其原理、影响、检测方法以及修复措…

基于MATLAB DCT域图像水印技术

1数字水印技术的概念和特点 数字水印(Digital Watermark)技术是将与多媒体内容相关或不相关的一些标示信息直接嵌入多媒体内容当中,但不影响原内容的使用价值,并不容易被人的知觉系统觉察或注意到。通过这些隐藏在多媒体内容中的…

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割! 【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割! 文章目录 【语义分割|代码解析】CMTFNet-2: …

在暗处执着生长,终有一日馥郁传香

总有人说很孤独,一个人吃饭,一个人上班,一个人逛街; 总有人又说享受孤独,面对时间,迎接苦难,战胜痛苦; 可没人说这些的大前提是你要有信念支撑啊,如果干完了上面的所有&a…

揭秘集装箱箱号自动识别原理,箱号识别算法

集装箱箱号自动识别算法是一种高效且实用的软件工具。它利用相机、手机或其他摄像头捕获集装箱箱号图像,并通过深度学习的OCR(光学字符识别)识别技术对集装箱号码进行准确识别。要想进行集装箱箱号识别,需要以下几个基本步骤&…

JavaScript 网页设计详解教程

JavaScript 网页设计详解教程 引言 JavaScript 是一种广泛使用的编程语言,主要用于网页开发。它使得网页具有动态交互性,能够响应用户的操作。随着前端开发的不断发展,JavaScript 已成为现代网页设计中不可或缺的一部分。本文将详细介绍 Ja…