当前位置: 首页 > news >正文

【积累】Python的类

类和方法的概念及实例

类 (Class):类是对具有相同属性和方法的对象集合的抽象描述。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

方法:类中定义的函数。

构造方法 __init__():这是一个特殊的方法,会在类实例化时自动调用。

实例变量:类中用变量表示的属性,这种变量称为实例变量,是用 self 修饰的变量。

实例化:创建一个类的实例,即创建一个类的具体对象。

继承:一个派生类 (derived class) 继承基类 (base class) 的属性和方法。继承允许将派生类对象作为基类对象对待。

为了便于理解,每种类型的示例都包括从简单到复杂的三个示例。

1. Python类:class

Python中的class相当于一个包含多个函数的集合。如果在AnimalClass类中有一个方法make_sound,当我们需要调用它时,必须使用AnimalClass.make_sound来调用,即在调用时需要带上类名。

简单示例

在这个简单示例中,我们定义了一个名为AnimalClass的类,它有一个类变量num_legs和一个方法make_sound

# AnimalClass 类
class AnimalClass:"""一个简单的类实例"""num_legs = 4def make_sound(self):return 'generic sound'# 实例化类
animal_instance = AnimalClass()
# 访问类的属性和方法
print("AnimalClass 类的属性 num_legs 为:", animal_instance.num_legs)
print("AnimalClass 类的方法 make_sound 输出为:", animal_instance.make_sound())
中等难度示例

在这个示例中,我们定义了一个名为Car的类,它有一个构造方法来初始化实例变量brandmodel,并且有一个方法display_info来显示车辆信息。

# Car 类
class Car:"""一个简单的类实例"""def __init__(self, brand, model):self.brand = brandself.model = modeldef display_info(self):return f"Car brand: {self.brand}, model: {self.model}"# 实例化类
car_instance = Car("Toyota", "Corolla")
# 访问类的方法
print(car_instance.display_info())
复杂示例

在这个复杂示例中,我们定义了一个名为NeuralNetwork的类,它继承了nn.Module,用于构建一个简单的神经网络。

# NeuralNetwork 类
import torch
import torch.nn as nnclass NeuralNetwork(nn.Module):def __init__(self):super(NeuralNetwork, self).__init__()self.layer1 = nn.Linear(10, 50)self.layer2 = nn.Linear(50, 1)def forward(self, x):x = torch.relu(self.layer1(x))x = self.layer2(x)return x# 实例化类
model = NeuralNetwork()
print(model)

2. 类的构造方法 __init__()

构造方法 __init__() 是类与外界的联系方法,当创建类的实例时,会自动调用这个方法。

简单示例

在这个简单示例中,我们定义了一个名为Point的类,它有一个构造方法来初始化实例变量x_coordy_coord

class Point:def __init__(self, x, y):self.x_coord = xself.y_coord = yp = Point(2.5, 4.0)
print(p.x_coord, p.y_coord)  # 输出结果:2.5 4.0
中等难度示例

在这个示例中,我们定义了一个名为Person的类,它有一个构造方法来初始化实例变量nameage,并且有一个方法greet来返回一个问候字符串。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef greet(self):return f"Hello, my name is {self.name} and I am {self.age} years old."p = Person("Alice", 30)
print(p.greet())
复杂示例

在这个复杂示例中,我们定义了一个名为Dataset的类,用于处理数据和标签的集合。它实现了两个特殊方法:__len__返回数据的长度,__getitem__返回指定索引的数据和标签。

class Dataset:def __init__(self, data, labels):self.data = dataself.labels = labelsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.labels[idx]data = [torch.randn(10) for _ in range(100)]
labels = [torch.randint(0, 2, (1,)) for _ in range(100)]
dataset = Dataset(data, labels)print(f"Dataset length: {len(dataset)}")
print(f"First item: {dataset[0]}")

3. 类中方法的参数 self

类方法的第一个参数必须是 self,它代表类的实例。

简单示例

在这个简单示例中,我们定义了一个名为Dog的类,它有一个构造方法来初始化实例变量name,并且有一个方法bark来打印狗叫声。

# 类定义
class Dog:def __init__(self, name):self.name = namedef bark(self):print(f"{self.name} says woof!")# 实例化类
dog_instance = Dog("Buddy")
dog_instance.bark()
中等难度示例

在这个示例中,我们定义了一个名为Rectangle的类,它有一个构造方法来初始化实例变量widthheight,并且有两个方法areaperimeter分别计算矩形的面积和周长。

class Rectangle:def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width + self.height)rect = Rectangle(3, 4)
print(f"Area: {rect.area()}, Perimeter: {rect.perimeter()}")
复杂示例

在这个复杂示例中,我们定义了一个名为LSTMNetwork的类,它继承了nn.Module,用于构建一个简单的LSTM神经网络。

class LSTMNetwork(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(LSTMNetwork, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.lstm(x)out = self.fc(out[:, -1, :])return out# 实例化类
lstm_model = LSTMNetwork(input_size=10, hidden_size=20, output_size=1)
print(lstm_model)

4. 继承

一个类可以继承另一个类的属性和方法,这称为继承。

简单示例

在这个简单示例中,我们定义了一个名为Animal的基类和一个名为Cat的派生类。Cat类继承了Animal类的属性和方法,并且重写了make_sound方法。

class Animal:def __init__(self, species):self.species = speciesdef make_sound(self):print("Some generic sound")class Cat(Animal):def __init__(self, species, name):super().__init__(species)self.name = namedef make_sound(self):print(f"{self.name} says meow")cat_instance = Cat("Feline", "Whiskers")
cat_instance.make_sound()
中等难度示例

在这个示例中,我们定义了一个名为Employee的基类和一个名为Manager的派生类。Manager类继承了Employee类的属性和方法,并且重写了work方法。

class Employee:def __init__(self, name, salary):self.name = nameself.salary = salarydef work(self):print(f"{self.name} is working")class Manager(Employee):def __init__(self, name, salary, department):super().__init__(name, salary)self.department = departmentdef work(self):print(f"{self.name} is managing the {self.department} department")manager_instance = Manager("Alice", 90000, "HR")
manager_instance.work()
复杂示例

在这个复杂示例中,我们定义了一个名为BaseModel的基类和一个

名为CNNModel的派生类。CNNModel类继承了BaseModel类的属性和方法,并且实现了forward方法。

class BaseModel(nn.Module):def __init__(self):super(BaseModel, self).__init__()def forward(self, x):raise NotImplementedError("Subclasses should implement this!")class CNNModel(BaseModel):def __init__(self, num_classes):super(CNNModel, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(64*7*7, 128)self.fc2 = nn.Linear(128, num_classes)self.dropout = nn.Dropout(0.5)def forward(self, x):x = F.relu(self.conv1(x))x = F.max_pool2d(x, kernel_size=2, stride=2)x = F.relu(self.conv2(x))x = F.max_pool2d(x, kernel_size=2, stride=2)x = x.view(-1, 64*7*7)x = F.relu(self.fc1(x))x = self.dropout(x)x = self.fc2(x)return x# 实例化类
cnn_model = CNNModel(num_classes=10)
print(cnn_model)

5. 方法重写

子类可以重写父类的方法。

简单示例

在这个简单示例中,我们定义了一个名为Animal的基类和一个名为Dog的派生类。Dog类重写了Animal类的sound方法。

class Animal:def sound(self):print('动物的声音')class Dog(Animal):def sound(self):print('狗叫声')dog_instance = Dog()  
dog_instance.sound()  
super(Dog, dog_instance).sound()  
中等难度示例

在这个示例中,我们定义了一个名为Writer的基类和一个名为Blogger的派生类。Blogger类重写了Writer类的write方法。

class Writer:def write(self):print("Writing generic content")class Blogger(Writer):def write(self):print("Writing blog content")blogger_instance = Blogger()
blogger_instance.write()
super(Blogger, blogger_instance).write()
复杂示例

在这个复杂示例中,我们定义了一个名为BaseOptimizer的基类和一个名为SGDOptimizer的派生类。SGDOptimizer类重写了BaseOptimizer类的step方法。

class BaseOptimizer:def __init__(self, lr):self.lr = lrdef step(self):raise NotImplementedError("Subclasses should implement this!")class SGDOptimizer(BaseOptimizer):def __init__(self, lr, momentum):super().__init__(lr)self.momentum = momentumdef step(self):print(f"Performing SGD step with lr={self.lr} and momentum={self.momentum}")# 实例化类
optimizer = SGDOptimizer(lr=0.01, momentum=0.9)
optimizer.step()

相关文章:

【积累】Python的类

类和方法的概念及实例 类 (Class):类是对具有相同属性和方法的对象集合的抽象描述。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 方法:类中定义的函数。 构造方法 __init__():这是一个特殊的方法,会在类实例…...

Golang | Leetcode Golang题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; func maxProduct(words []string) (ans int) {masks : map[int]int{}for _, word : range words {mask : 0for _, ch : range word {mask | 1 << (ch - a)}if len(word) > masks[mask] {masks[mask] len(word)}}for x, lenX : ra…...

【感想】支持八股文在面试的应用

八股文&#xff1a;程序员面试中的利与弊 在现代社会的职场竞争中&#xff0c;尤其是IT行业&#xff0c;面试环节常常成为决定一个人能否入职的重要关卡。在这其中&#xff0c;“八股文”作为一种被广泛应用的考核工具&#xff0c;已经成为面试中不可或缺的一部分。然而&#…...

B - 02-计算球的体积 51Nod - 3266

对于半径为 rr 的球&#xff0c;其体积的计算公式为 V4/3πr3V4/3πr3 &#xff0c;这里取 π3.14π3.14 。现给定 rr &#xff0c;求 VV 。 Input 输入为一个不超过 100100 的非负实数&#xff0c;即球半径&#xff0c;类型为 doubledouble 。 Output 输出一个实数&#x…...

Qt pro文件详解

概述 在Qt中&#xff0c;.pro 文件&#xff08;也称为项目文件&#xff09;是Qt项目管理系统&#xff08;qmake&#xff09;所使用的配置文件。这个文件定义了如何构建你的Qt应用程序或库&#xff0c;其使用简单的键值对语法&#xff0c;允许你指定源文件、头文件、库依赖、配置…...

JavaFX布局-ButtonBar

JavaFX布局-ButtonBar 常用属性buttonOrderpaddingbuttonMinWidth 实现方式Java实现fxml实现 一个特殊的容器&#xff0c;用于创建一组按钮&#xff0c;水平排列按钮太多&#xff0c;会被遮住&#xff0c;不会自动产生滚动条 常用属性 buttonOrder 预制顺序 buttonBar.setBut…...

【C++程序设计】——利用数组处理批量数据(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…...

使用 1panel面板 部署 php网站

代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名&#xff08;可跳过&#xff09;3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件&#xff08;服务器和面板开放端口&#xff09;7. 创…...

Windows调大虚拟内存来代替升级物理运行内存(RAM)真的有用吗?

前言 前段时间有个粉丝突发奇想说&#xff1a;电脑运行内存不足&#xff0c;调大虚拟内存来代替升级物理运行内存&#xff08;内存条&#xff09;不就可以了&#xff1f;剩下的大几百块钱吃香的喝辣的不好吗&#xff1f; 嗯。。。直到2024年的今天&#xff0c;估计还有很多小…...

[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果

本篇是在之前的基础上&#xff0c;继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示&#xff1a;...

java算法day28

java算法day28 300 最长递增子序列136 只出现一次的数字169 多数元素234 回文链表53 最大子数组和 300 最长递增子序列 这个是记忆化搜索的代码。是从递归改过来的。 这题显然是要用dp做比较合适。因为很容易看到原问题与子问题之间的关系。 还是从后往前看。 然后可以利用选…...

vue实现歌词滚动效果

1.结构 <template><div class"lyricScroll"><div class"audio"><audio id"audio" src"./common/周传雄-青花1.mp3" controls></audio></div><div class"container" id"contai…...

【算法设计题】合并两个非递减有序链表,第1题(C/C++)

目录 第1题 合并两个非递减有序链表 得分点&#xff08;必背&#xff09; 题解 函数声明与初始化变量&#xff1a; 初始化合并链表的头节点&#xff1a; 合并两个链表&#xff1a; 处理剩余节点&#xff1a; 返回合并后的链表&#xff1a; 完整测试代码 &#x1f308;…...

Vue前端工程

创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…...

什么是药物临床试验?

药物临床试验是指在人体上进行的新药试验研究&#xff0c;旨在确定新药的疗效、安全性、药代动力学和药效学。临床试验不仅帮助确认药物是否对特定疾病或症状有效&#xff0c;还帮助识别和评估药物的副作用和风险。 药物临床试验&#xff08;Clinical Trial&#xff0c;CT&…...

编译和汇编的区别

一、编译 编译是将高级语言&#xff08;如C、C、Java等&#xff09;编写的源代码转换成计算机可以直接执行的低级语言&#xff08;通常是机器语言或汇编语言&#xff09;的过程 编译 —— 将人类可读的源代码转换为计算机可执行的指令集 编译过程 通常包括词法分析、语法分…...

C# 设计倒计时器、串口助手开发

文章目录 1. 实现一个简单的倒计时器开始、暂停2. 串口助手开发 1. 实现一个简单的倒计时器开始、暂停 namespace Timer {public partial class Form1 : Form{int count;//用于定时器计数int time;//存储设定的定时值bool parse false;//控制暂停计时public Form1(){Initiali…...

图论① dfs | Java | LeetCode 797,Kama 98 邻接表实现(未完成)

797 所有可能路径 https://leetcode.cn/problems/all-paths-from-source-to-target/description/ 输入&#xff1a;graph [[1,2],[3],[3],[]] 题目分析&#xff0c;这里 class Solution {//这个不是二维数组&#xff0c;而是listList<List<Integer>> res new Ar…...

Mac安装nvm以及配置环境变量

安装nvm brew install nvm安装成功后会出现这样一段话: Add the following to your shell profile e.g. ~/.profile or ~/.zshrc:export NVM_DIR"$HOME/.nvm"[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh&q…...

AUTOSAR实战教程-使用DET来发现开发错误

2年之前因为在调试AUTOSAR存储协议栈的时候使用DET并没发现有用的信息,所以就武断下结论--这玩意没有用。活到老学到老吧,bug经历的多了,发现这玩意还挺有用的。说一下这个bug的背景。 在将时间同步报文改道CanTsync之后,由于这个AUTOSAR工具本身的问题以及配置工程师本身的…...

Python 函数式编程利器:Partial 与 ParamSpec 技术解析

partial 是 Python functools 模块中的偏函数&#xff0c;核心作用是「冻结」一个函数的部分参数&#xff08;位置参数或关键字参数&#xff09;&#xff0c;生成一个新的函数&#xff0c;新函数调用时只需传入剩余未被冻结的参数即可&#xff0c;无需重复传入固定参数&#xf…...

收藏!程序员转行大模型必看:6高潜职业方向与学习资料包推荐

收藏&#xff01;程序员转行大模型必看&#xff1a;6高潜职业方向与学习资料包推荐 大模型技术引领行业变革&#xff0c;为程序员带来转行机遇。本文推荐6大高潜职业方向&#xff1a;自然语言处理工程师、计算机视觉工程师、大模型算法工程师、大模型部署工程师、大模型产品经理…...

从零构建MAX30102心率血氧监测系统

1. MAX30102传感器基础认知 第一次接触MAX30102时&#xff0c;我盯着这个5mm3mm的小芯片看了半天——很难想象这么小的器件能同时测量心率和血氧。它本质上是个光电生物传感器&#xff0c;工作原理就像用手电筒照手指&#xff1a;内置的红光(660nm)和红外光(880nm)LED穿过皮肤组…...

ShapeOfView贡献指南:如何为开源项目添加新的自定义形状

ShapeOfView贡献指南&#xff1a;如何为开源项目添加新的自定义形状 【免费下载链接】ShapeOfView Give a custom shape to any android view, Material Design 2 ready 项目地址: https://gitcode.com/gh_mirrors/sh/ShapeOfView ShapeOfView是一款强大的Android开源库…...

nomic-embed-text-v2-moe保姆级教程:Gradio自定义CSS主题与响应式布局

nomic-embed-text-v2-moe保姆级教程&#xff1a;Gradio自定义CSS主题与响应式布局 1. 从零开始&#xff1a;认识nomic-embed-text-v2-moe 如果你正在寻找一个既强大又好用的文本嵌入模型&#xff0c;特别是需要处理多语言内容&#xff0c;那么nomic-embed-text-v2-moe绝对值得…...

手把手教你用Swaks和Gophish绕过SPF,搭建自己的邮件钓鱼测试环境(附避坑指南)

企业级邮件安全测试实战&#xff1a;从SPF绕过到钓鱼环境搭建 邮件安全测试已成为企业安全防护体系中不可或缺的一环。据统计&#xff0c;超过90%的网络攻击始于钓鱼邮件&#xff0c;而其中近40%的成功攻击源于SPF配置不当或完全缺失。本文将系统性地介绍如何构建一个完整的邮件…...

告别黑盒调试:为VS2022和Halcon HImage定制一个带暗色主题的视觉化调试器

为VS2022和Halcon HImage打造沉浸式暗色调试器&#xff1a;从UI优化到高效开发实践 在计算机视觉开发领域&#xff0c;Halcon凭借其强大的图像处理能力成为工业检测、医疗影像等场景的首选工具。然而&#xff0c;长时间面对传统调试界面容易导致视觉疲劳&#xff0c;影响开发效…...

LEDPatternLib:非阻塞LED动画库设计与嵌入式实践

1. 项目概述LEDPatternLib 是一款面向嵌入式 LED 动画控制的轻量级、模块化 Arduino 库&#xff0c;专为资源受限的微控制器平台设计。其核心目标并非替代底层驱动&#xff0c;而是构建在成熟硬件抽象层之上的非阻塞&#xff08;non-blocking&#xff09;模式动画调度框架。该库…...

CST仿真设计:反射透射性线圆转换与线线转换实战案例及录屏教程

cst仿真设计 反射透射性线圆转换&#xff0c;线线转换 案例与录屏打开CST刚打开模板栏是不是总盯着默认的几个空模板发呆&#xff1f;今天咱们整点新手入门但能快速装逼朋友圈或者中期报告材料的活——反射透射都能玩的偏振转换超表面&#xff08;Metasurface&#xff09;&…...

从MSTAR到RSDD-SAR:一文看懂SAR目标检测数据集20年演进,你的模型该用哪个?

从MSTAR到RSDD-SAR&#xff1a;SAR目标检测数据集的二十年技术进化与选型实战 军用雷达技术研究员李明曾在2018年遇到一个棘手问题&#xff1a;他训练的舰船检测模型在实验室测试准确率达到98%&#xff0c;实际部署到南海海域时性能却暴跌至62%。问题根源很快锁定在数据集——他…...