【积累】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的类,它有一个构造方法来初始化实例变量brand和model,并且有一个方法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_coord和y_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的类,它有一个构造方法来初始化实例变量name和age,并且有一个方法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的类,它有一个构造方法来初始化实例变量width和height,并且有两个方法area和perimeter分别计算矩形的面积和周长。
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题最大单词长度乘积
题目: 题解: 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…...
【感想】支持八股文在面试的应用
八股文:程序员面试中的利与弊 在现代社会的职场竞争中,尤其是IT行业,面试环节常常成为决定一个人能否入职的重要关卡。在这其中,“八股文”作为一种被广泛应用的考核工具,已经成为面试中不可或缺的一部分。然而&#…...
B - 02-计算球的体积 51Nod - 3266
对于半径为 rr 的球,其体积的计算公式为 V4/3πr3V4/3πr3 ,这里取 π3.14π3.14 。现给定 rr ,求 VV 。 Input 输入为一个不超过 100100 的非负实数,即球半径,类型为 doubledouble 。 Output 输出一个实数&#x…...
Qt pro文件详解
概述 在Qt中,.pro 文件(也称为项目文件)是Qt项目管理系统(qmake)所使用的配置文件。这个文件定义了如何构建你的Qt应用程序或库,其使用简单的键值对语法,允许你指定源文件、头文件、库依赖、配置…...
JavaFX布局-ButtonBar
JavaFX布局-ButtonBar 常用属性buttonOrderpaddingbuttonMinWidth 实现方式Java实现fxml实现 一个特殊的容器,用于创建一组按钮,水平排列按钮太多,会被遮住,不会自动产生滚动条 常用属性 buttonOrder 预制顺序 buttonBar.setBut…...
【C++程序设计】——利用数组处理批量数据(二)
👨💻个人主页:开发者-削好皮的Pineapple! 👨💻 hello 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 削好皮的Pineapple! 原创 👨Ǵ…...
使用 1panel面板 部署 php网站
代码仓库:https://github.com/talmudmaster/RedCorpus 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名(可跳过)3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件(服务器和面板开放端口)7. 创…...
Windows调大虚拟内存来代替升级物理运行内存(RAM)真的有用吗?
前言 前段时间有个粉丝突发奇想说:电脑运行内存不足,调大虚拟内存来代替升级物理运行内存(内存条)不就可以了?剩下的大几百块钱吃香的喝辣的不好吗? 嗯。。。直到2024年的今天,估计还有很多小…...
[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果
本篇是在之前的基础上,继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示:...
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题 合并两个非递减有序链表 得分点(必背) 题解 函数声明与初始化变量: 初始化合并链表的头节点: 合并两个链表: 处理剩余节点: 返回合并后的链表: 完整测试代码 🌈…...
Vue前端工程
创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…...
什么是药物临床试验?
药物临床试验是指在人体上进行的新药试验研究,旨在确定新药的疗效、安全性、药代动力学和药效学。临床试验不仅帮助确认药物是否对特定疾病或症状有效,还帮助识别和评估药物的副作用和风险。 药物临床试验(Clinical Trial,CT&…...
编译和汇编的区别
一、编译 编译是将高级语言(如C、C、Java等)编写的源代码转换成计算机可以直接执行的低级语言(通常是机器语言或汇编语言)的过程 编译 —— 将人类可读的源代码转换为计算机可执行的指令集 编译过程 通常包括词法分析、语法分…...
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/ 输入:graph [[1,2],[3],[3],[]] 题目分析,这里 class Solution {//这个不是二维数组,而是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工具本身的问题以及配置工程师本身的…...
OAuth 2.0 and OIDC 三大安全机制对比:State vs Nonce vs PKCE
一、问题背景 OAuth 2.0 和 OpenID Connect 的授权流程依赖浏览器重定向,这天然暴露了多种攻击面: 攻击类型描述CSRF攻击者诱导用户的浏览器携带恶意授权码完成绑定Token 重放窃取的 id_token 被重复提交给客户端授权码劫持恶意应用在同一设备上拦截授…...
Agent OS:AI智能体开发的操作系统级解决方案
1. 项目概述:一个为AI智能体而生的操作系统最近在AI智能体开发圈子里,一个名为“Agent OS”的项目热度持续攀升。它来自Rivet.dev团队,定位非常清晰:一个专为构建、运行和管理AI智能体而设计的操作系统。如果你正在尝试将大语言模…...
Fast-GitHub:三步安装解决国内GitHub访问难题的终极指南
Fast-GitHub:三步安装解决国内GitHub访问难题的终极指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是否经常因为…...
用PCA给高维数据‘瘦身’:从鸢尾花数据集到人脸图像,实战对比降维效果与可视化技巧
用PCA给高维数据‘瘦身’:从鸢尾花数据集到人脸图像,实战对比降维效果与可视化技巧 当面对成百上千维的数据时,我们常会陷入"维度灾难"的困境——计算资源吃紧、模型训练缓慢,更糟的是噪声干扰导致分析结果失真。主成分…...
高效视频帧提取终极指南:为深度学习构建专业数据集
高效视频帧提取终极指南:为深度学习构建专业数据集 【免费下载链接】video2frame Yet another easy-to-use tool to extract frames from videos, for deep learning and computer vision. 项目地址: https://gitcode.com/gh_mirrors/vi/video2frame 在计算机…...
从0到1:手把手教你搭建VSCode(附避坑指南,拒绝报错),全程复制粘贴即可
🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...
Docker容器化Emacs:构建可移植、一致的开发环境解决方案
1. 项目概述:为什么要在Docker里运行Emacs?如果你是一个Emacs的重度用户,或者是一个开发者,你很可能遇到过这样的困境:你精心配置的Emacs环境,在换了一台新电脑、升级了操作系统,或者需要在多台…...
5分钟快速上手:Windows虚拟显示器终极指南,轻松实现多屏扩展
5分钟快速上手:Windows虚拟显示器终极指南,轻松实现多屏扩展 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 还在为单显示器工作效率低下而烦恼吗…...
pgui:轻量级跨平台C++ GUI框架的设计与集成实践
1. 项目概述:一个轻量级、跨平台的现代GUI框架如果你是一名C开发者,并且厌倦了Qt的臃肿、MFC的古老,或者觉得Dear ImGui虽然强大但需要自己管理太多渲染细节,那么你很可能和我一样,一直在寻找一个“刚刚好”的GUI解决方…...
免费开源图片去重工具:AntiDupl.NET完整使用教程
免费开源图片去重工具:AntiDupl.NET完整使用教程 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 还在为电脑中堆积如山的重复图片而烦恼吗?每次…...
