面向对象编程:一切皆对象
面向对象(OOP)是一种编程范式,它使用''对象''来设计软件。对象可以包含数据和代码:数据代表对象的状态,而代码代表操作数据的方式。在面向对象编程中,一切皆对象,这意味着将现实世界事务使用类与实例来模拟,如灯,汽车,导弹,杯子,都可以用类和实例来模拟。
一 、类与实例
类
类是对现实世界描述的一种类型。它定义了一组具有相同属性和方法的对象的结构。类名通常使用大驼峰命名法,例如 ElectricCar。
class ElectricCar:pass
类是抽象的,约定了未来实例应该有的内容,是实例的模板。
实例
实例是类的具现化。通过调用类来生成实例:
class ElectricCar:pass
my_car = ElectricCar()
实例是具体的,具有具体的数据。实例的内容依赖于类。
二、self
self 是类的一个特殊变量,用于代表未来的实例。在类的内部,self 用于访问类的属性和方法。
初始化函数
__init__ 是一个特殊的方法,称为构造器,用于初始化新创建的对象。
class ElectricCar:def __init__(self, make, model):self.make = makeself.model = model
魔法函数
Python 提供了一系列特殊的方法,称为魔法函数,例如 __str__、__len__ 和比较方法 __eq__ 等。
# 内部编写所有魔法方法的使用案例
'''
以双下滑线开头和结尾的为魔法函数
__init__: 用于初始化对象。
__str__: 返回实例用字符串表示,自定义内容
__len__:当使用 len() 函数时调用,返回容器类型的长度。实例与实例之间也可以比较了
__eq__ :==触发
__ne__ :!=触发
__gt__ :>触发
__ge__ :>=触发
__lt__ :< 触发
__le__ :<=触发__add__ :+触发
__sub__ :-触发
__mul__ :*触发
__truediv:/触发
__floordiv__://触发
__mod__:%触发
__divmod__:div(x,y)触发
'''# class Myclass:
# def __init__(self, name, age):
# print('初始化函数执行了')
# self.name = name
# self.age = age
#
# def __str__(self):
# return f'姓名:{self.name},年龄:{self.age}'
#
# def __len__(self):
# return len(self.name)
#
# def __gt__(self, other):
# '''
# 用>来判断年龄大小
# :param other:
# :return:
# '''
# return self.age > other.age
#
# def __lt__(self, other):
# '''
# 用<来判断 年龄大小
# :param other:
# :return:
# '''
# return self.age < other.age
#
# def __ge__(self, other):
# '''
# 用>=来判断 年龄大小
# :param other:
# :return:
# '''
# return self.age >= other.age
#
# def __le__(self, other):
# '''
# 用<=来判断 年龄大小
# :param other:
# :return:
# '''
# return self.age <= other.age
#
# def __eq__(self, other):
# '''
# 判断两个实例age和name是否完全相等
# :param other:
# :return:
# '''
# return self.age == other.age and self.name == other.name
#
# def __ne__(self, other):
# '''
# 判断两个实例 age 或者 name 是否有一方不相等
# :param other:
# :return:
# '''
# return self.age != other.age or self.name != other.name
#
# def __add__(self, other):
# '''
# 返回两个实例的age相加
# :param other:
# :return:
# '''
# return self.age + other.age
#
# def __mul__(self, other):
# '''
# 返回两个实例的age乘积
# :param other:
# :return:
# '''
# return self.age * other.age
#
# def __divmod__(self, other):
# '''
# 先求除 再求余
# :param other:
# :return:
# '''
# return divmod(self.age, other.age)
#
# def __mod__(self, other):
# '''
# 返回两个实例的
# :param other:
# :return:
# '''
# return self.age % other.age
#
#
# mc = Myclass('亲亲亲', 18)
# print(mc)
# # __len__
# print(len(mc))
#
# mc2 = Myclass('顺子', 18)
# # __str__
# print(mc2)
# __gt__
# print(mc > mc2)
# # __lt__
# print(mc < mc2)
# # __ge__
# print(mc >= mc2)
# __le__
# print(mc <= mc2)
# __eq__
# print(mc == mc2)
# # __nq__
# print(mc != mc2)
# # __add__
# print(mc + mc2)
# # __mul__
# print(mc * mc2)
# __mod__
# print(mc % mc2)
# __divmod__
# print(divmod(mc, mc2))
构造函数与析构函数
构造函数用于创建实例,返回实例,通过父类来创建实例,super()._new()而析构函数在实例不再使用时执行,用于清理资源。
"""
构造函数:创建并且返回实例(self)
初始化函数: self已经创建完成,可以向self中添加数据
析构函数: 销毁实例 清理实例内存 实例不在使用则回收实例内存之前汇执行对应的析构函数
"""# class MyClass:
# def __new__(cls, *args, **kwargs):
# # 调用父类的new方法创建一个实例
# instance = super().__new__(cls)
# print(f"构造函数执行了", id(instance))
# # 将创建好的实例返回 返回给初始化函数
# return instances
#
# def __init__(self, name):
# print(f"初始化函数执行了", id(self))
# self.name = name
#
# def __del__(self):
# print(f"析构函数执行了")
#
#
# mc1 = MyClass("阿拉伯")
# print(id(mc1), id(None), mc1 is None)
#
# mc1 = None
# print("程序执行完毕 将要退出")
# # 程序退出执行析构mc1class MyOpen:def __init__(self, filename, mode="r", encoding="utf8"):self.f = open(filename, mode=mode, encoding=encoding)def read_all(self):return self.f.read()def __del__(self):self.f.close()mo = MyOpen("./65.魔法函数.py")
print(mo.read_all())
三、三大特性
封装
封装是将数据(属性)和操作数据的方法组合在一起的过程。封装确保了数据的安全性,只能通过特定的方法来访问和修改。
# 装饰器:一个函数,用于增强或修改另一个函数的行为,通常通过返回一个新的函数来实现。
import random
import timedatas = [random.randint(0, 10000) for i in range(10000)]
# 通过浅拷贝 得到一模一样的列表
datas_copy = datas.copy()def time_cost(f):def calc():stat = time.time()f()print(f'{f}花费的时间开销为:{time.time() - stat}')return calc@time_cost
def my_fun1():datas.sort()print(datas)my_fun1()@time_cost
def my_fun2():new_list = sorted(datas_copy)print(new_list)my_fun2()import random
import timedatas = [random.randint(0, 10000) for i in range(10000)]
# 通过浅拷贝 得到一模一样的列表
datas_copy = datas.copy()def time_cost(f):def calc():stat = time.time()f()print(f'{f.__name__}花费的时间开销为:{time.time() - stat}')return calcdef fun1():datas.sort()print(datas)fun1 = time_cost(fun1)
fun1() # 此时的fun1()不是fun1()而是calc()def fun2():new_list = sorted(datas_copy)print(new_list)fun2 = time_cost(fun2)
fun2() # 此时的fun2()不是fun2()而是calc()
继承
继承允许新创建的类(子类)继承现有类(父类)的属性和方法。
- __base__ :获取父类
- __bases__ :获取父类元组
- __class__ :返回实例对应的类
多继承
继承多个父类-java,c# 只支持单继承,通过接口等来实现多继承的功能,Python直接就可以有多个父类。
# 多继承 继承多个父类class SpeakAble:def __init__(self, la):self.la = ladef speak(self):return print(f'I can speak {self.la}')class SpeedAble:def __init__(self, speed):self.speed = speeddef move(self):print(f'Moving at a speed of {self.speed} km/h')class Person(SpeedAble, SpeakAble):def __init__(self, name, la, speed):self.name = nameSpeedAble.__init__(self, speed)SpeakAble.__init__(self, la)def __str__(self):return f'name: {self.name}, language: {self.la}, speed: {self.speed}'class ATM(Person):def __init__(self, name, speed, la, skill):super().__init__(name, la, speed)self.skill = skilldef show(self):return print(f'{self.name},{self.speed},{self.la},{self.skill}')def attack(self):print(f'{self.name} is attacking with a skill: {self.skill}')atmo = ATM('赛罗', 1000, '光环语言', '赛罗光纤')
atmo.show()
atmo.move()
atmo.speak()
atmo.attack()
# 多继承 mro : method(方法) retrieval(检索) order(顺序)
# Python3 使用广度优先# print(ATM.mro())
多态
多态允许同一个接口接受不同的数据类型。在Python中,多态是隐式实现的,不需要显式定义。
# 同名不同参数# def my_fun(a):
# print(a)
#
#
# def my_fun(a, b):
# print(a, b)
#
#
# # 后一个的my_fun()覆盖掉了上方的my_fun
# my_fun(10, 2)# 在面向对象编程中,子类可以重写父类的方法,当调用子类实例的方法时,将执行子类中的方法定义。
class Animal:def walk(self, speed):print('walk')class Dog(Animal):def walk(self, speed):print('run')class Cat(Animal):def walk(self, speed):print('sheep')# 类似于多态!结果以元组的形式输出
def my_fun(*args):print(args)my_fun(10)
my_fun(10, 11)
my_fun(10, 11, 22)
my_fun(10, 11, 22, 33)
抽象类
抽象类是一种特殊的类,它不能被实例化,但可以包含抽象方法。子类继承抽象类时,必须实现这些抽象方法。
'''
抽象类是一种不能被实例化的类
'''from abc import ABC, abstractmethodclass Animal(ABC):'''通过装饰器abstractmethod把walk变为抽象方法'''@abstractmethoddef walk(self):passdef eat(self):print('可以吃')class Dog(Animal):def walk(self):print('dog can walk')class Cat(Animal):def walk(self):print('cat can walk')dog = Dog()
dog.walk() # 输出: Woof!cat = Cat()
cat.walk() # 输出: Meow!
四、类中内容
实例属性
向实例中添加的数据,可以通过类内 self 或类外实例来添加。
实例方法
第一个参数是 self 的方法,可以通过类内或类外实例来调用。
class Person:def __init__(self, name, sex):self.name = nameself.sex = sexdef set_name(self, name):self.name = namedef __str__(self):return f'类名:{self.name} 类别:{self.sex}'p = Person('泉', '男')
print(p)
类属性
类属性可以通过类名直接访问和设置。
class MyClass:# 类属性class_attribute = 'I am a class attribute'@classmethoddef class_method(cls):print(cls.class_attribute)@classmethoddef update_class_attribute(cls, new_value):cls.class_attribute = new_valueprint(MyClass.class_attribute) # I am a class attributeMyClass.class_method() # I am a class attribute
类方法
使用 @classmethod 装饰器的方法,第一个参数通常是 cls,表示类本身。
class MyClass:@classmethoddef class_method(cls):# cls 代表 MyClass 类print(f"这是 {cls} 的类方法")# 类方法可以通过类直接调用,也可以通过类的实例调用,但推荐通过类直接调用。MyClass.class_method() # 推荐方式# 实例也可以调用类方法,但这不是推荐的做法
my_instance = MyClass()
my_instance.class_method()
静态方法
使用 @staticmethod 装饰器的方法,没有特殊的参数,通常用于辅助功能。
# 静态方法 不需要 self 或 cls 参数,不能访问类或实例的属性。
class GamePerson:@staticmethoddef play_name():pass@staticmethoddef play_age():pass@staticmethoddef play_sex():pass@staticmethoddef play_address():passGamePerson.play_name()
GamePerson.play_age()
GamePerson.play_address()
GamePerson.play_sex()
五、Python的灵活性
Python 是一种解释性语言,允许动态地向类中添加内容,包括属性、方法等。
数据的访问级别
在面向对象编程中,数据的访问级别(也称为访问修饰符)用于控制类成员(属性和方法)的可见性和可访问性。Python 没有像 Java 或 C++ 那样的严格访问级别,但是它遵循一些约定来模拟访问控制。以下是 Python 中常见的数据访问级别:
公有(Public)
- 公有属性和方法没有特定的修饰符。它们可以直接从类的实例和类的外部访问。
- 公有成员通常以小写字母开头,这是 Python 的惯例。
# 公有(Public)
class Car:def __init__(self, color):self.color = color # 公有属性def start(self): # 公有方法return f'The car starts.'print(car.start())
私有(Private)
- 私有成员以双下划线
__开头。它们通常只在类内部使用,不可从类的外部直接访问。 - Python 中的私有属性和方法实际上并不是真正的私有,它们可以通过
_classname__attributename的方式访问,但这是一种约定,表明这些成员不应该从外部访问。# 私有(Private) # 私有成员以双下划线 __ 开头。 class Car:def __init__(self): # 私有属性self.__max_spend = 200def get_max_spend(self): # 公开私有属性的方法return self.__max_spendcar = Car() print(car.get_max_spend())保护(Protected)
- 受保护的成员以单个下划线
_开头。它们可以在类本身和继承的子类中访问,但不应在类的外部访问。 - 与私有成员一样,Python 中的受保护成员也不是真正的受保护,但遵循约定不应从外部访问。
# 私有(Private) # 私有成员以双下划线 __ 开头。 class Car:def __init__(self): # 私有属性self.__max_spend = 200def get_max_spend(self): # 公开私有属性的方法return self.__max_spend
- 受保护的成员以单个下划线
六、属性封装
使用 @property 装饰器可以创建只读属性,使用 @属性名.setter 可以定义设置属性值的方法。
上方的代码保护(Protected)中_color 属性是一个受保护的成员,这意味着它按照惯例应该只在类内部或子类中访问。然而,由于 Python 的动态特性仍可以通过从类的外部访问和修改它。
为了更好地封装,可以使用属性装饰器 @property 来提供对属性的受控访问:
# 保护(Protected)
class Car:def __init__(self):self._color = 'red' # 受保护的属性@propertydef color(self):# 只读属性,外部不能直接设置_color的值return self._color@color.setterdef color(self, new_color):# 可以在这里添加验证逻辑self._color = new_color# 使用 setter 方法修改颜色
car = Car()
car.color = 'yellow' # 使用属性的方式调用 setter 方法
print(car.color) # 使用属性的方式获取颜色,将输出 'yellow'
在这个修改后的版本中,color 是一个属性,提供了对 _color 的受控访问。外部代码应该使用 car.color 来获取和设置颜色值,而不是直接使用 car._color。这样,您可以在 color 的 setter 方法中添加验证逻辑,确保属性值的有效性。
单例类
单例类确保只有一个实例存在。它通过控制构造函数来实现这一点。
class Person:pass# 每次调用类都可以生成一个新的实例
p1 = Person()
p2 = Person()
p3 = Person()print(p1 is p2, p2 is p3, p3 is p1)class Manage(object):instance = Nonedef __new__(cls, *args, **kwargs):'''对构造函数进行控制 不是每次都生成新的实例1. 对类属性instance判断 如果为空 就构造一个实例 并且把实例赋予instance2. 对类属性instance判断 如果不为空 则直接把他返回'''if not Manage.instance:Manage.instance = super().__new__(cls)return Manage.instancedef __init__(self):print('初始化函数执行了')m1 = Manage()
m2 = Manage()
print(m1 is m2, m1 is None, m2 is None)
结论
面向对象编程是一种强大的范式,它通过类和实例的概念,提供了一种自然的方式来模拟现实世界中的事务。Python 的灵活性和动态特性使得OOP在Python中得以广泛应用。通过封装、继承和多态,OOP提高了代码的可重用性、灵活性和可维护性。
相关文章:
面向对象编程:一切皆对象
面向对象(OOP)是一种编程范式,它使用对象来设计软件。对象可以包含数据和代码:数据代表对象的状态,而代码代表操作数据的方式。在面向对象编程中,一切皆对象,这意味着将现实世界事务使用类与实例来模拟,如灯࿰…...
GIT版本管理与分支控制
目录 1、了解Git功能 2、第一次使用Git(首次配置好,后续不用再操作) 打开git后端 设置用户签名 结果 3、初始项目架构 创建本地新仓库并初始化 文件添加到本地仓库 a.文件添加缓存区 b.缓存区内容提交到本地仓库 c.改写提交的注释 …...
大模型算法备案流程最详细说明【流程+附件】
文章目录 一、语料安全评估 二、黑盒测试 三、模型安全措施评估 四、性能评估 五、性能评估 六、安全性评估 七、可解释性评估 八、法律和合规性评估 九、应急管理措施 十、材料准备 十一、【线下流程】大模型备案线下详细步骤说明 十二、【线上流程】算法备案填报…...
JAVA GUI 基本使用
package com.lu.gui;import javax.swing.*; import java.awt.*;public class MyJFrame extends JFrame {public MyJFrame() {this.setBackground(Color.BLACK);this.setResizable(false);this.setSize(500,500);this.setTitle("登录页面");} }package com.lu.gui;imp…...
【涵子来信】——AI革新:1.新时代是便捷的,要会用
各位读者朋友们: 我们现在AI时代的十字路口,AI是为生活带来便利的,我们要会使用AI。今天这篇文章来讲述一下AI的正确使用。 一、 AI的使用 1.1.便捷之中要会辨别 AI是带来强大的,利用好可以给生活带来便捷。 像之前WWDC24宣传…...
自定义线程池实现(一)
预期目标 1.实现一个相对完备的线程池 2.自定义拒绝策略(下一节) 线程池的基本参数 1.核心线程数 2.超时时间 3.拒绝策略(在下一篇中添加) 4.工作队列 5.任务队列 工作机制 当添加一个任务到线程池中时,线程池会…...
计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
基于springboot+vue+uniapp的校园快递平台小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
这两个大龄程序员,打算搞垮一个世界软件巨头!
大家都知道,Adobe是多媒体和数字内容创作者的绝对王者,它的旗下有众多大家耳熟能详的软件:Photoshop、Illustrator、Premiere Pro、After Effects、InDegign、Acrobat、Animate等等。 这些软件使用门槛很高,价格昂贵,安…...
LabVIEW放大器自动测量系统
开发了一个基于LabVIEW平台的多路前置放大器自动测量系统的开发与实施。该系统集成了硬件控制与软件编程,能够实现放大器各项性能指标的快速自动测量,有效提高了测试的精确性和效率。系统设计采用了虚拟仪器技术,结合了先进的测量与控制策略&…...
全面整理人工智能(AI)学习路线图及资源推荐
在人工智能(AI)飞速发展的今天,掌握AI技术已经成为了许多高校研究者和职场人士的必备技能。从深度学习到强化学习,从大模型训练到实际应用,AI技术的广度和深度不断拓展。作为一名AI学习者,面对浩瀚的知识海…...
react antd upload custom request处理多个文件上传
react antd upload custom request处理多个文件上传的问题 背景:第一次请求需要请求后端返回aws 一个link,再往link push文件,再调用另一个接口告诉后端已经上传成功,拿到返回值。 再把返回值传给业务api... 多文件上传一直是循环…...
ALB快速实现IPv4服务的负载均衡
阿里云应用型负载均衡ALB支持HTTP、HTTPS和QUIC协议,专门面向网络应用层,提供强大的业务处理能力。 为了实现IPv4服务的负载均衡,需要快速创建一个ALB实例,并将来自客户端的访问请求转发至后端服务器。 操作流程 第一步&#x…...
【LLM】-12-部署Langchain-Chatchat-0.3.x版本
目录 1、0.3与0.2的功能对比 2、0.3.x支持多种部署方式 2.3、源码安装 2.3.1、项目源码下载 2.3.2、创建conda环境 2.3.3、安装poetry 2.3.4、安装依赖库 2.3.5、项目初始化 2.3.6、配置文件 2.3.7、初始化知识库 2.3.7、启动服务 2.3.8、配置说明 2.3.8.1、basic_…...
优化网络接收缓存减少数据丢包
视频领域,网络udp数据丢包会引起视频解码花屏。 1、修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话,则…...
数据透视——判别分析
文章目录 判别分析简介常用的判别分析方法距离判别贝叶斯判别线性判别分析(LDA)支持向量机(SVM)总结 补充 在数据科学的丰富领域中,判别分析扮演着至关重要的角色。它是一种统计方法,用于预测样本数据的类别…...
书生大模型学习笔记 - 连接云端开发机
申请InternStudio开发机: 这里进去报名参加实战营即可获取 书生大模型实战营 InternStudio平台 创建开发机 SSH连接开发机: SSH免密码登录 本地创建SSH密钥 ssh-keygen -t rsa打开以下文件获取公钥 ~/.ssh/id_rsa.pub去InternStudio添加公钥 …...
Python操作符的重载
目录 1、操作符重载的基本概念1.1、常用的操作符重载方法1.1.1、算术操作符1.1.2、比较操作符1.1.3、比其他操作符 1.2、例子 2、应用场景2.1、增强代码的可读性2.2、 实现类的数学运算2.3、支持自定义的数据结构2.4、简化 API 设计2.5、实现链式操作和流式接口 3、总结 Python…...
redis面试(三)Hash数据结构
HASH 哈希,在redis底层实现的时候,数据的结构叫做dict 这个Dict就是一个用于维护key和value映射关系的数据结构,与很多语言中的Map类型相似。 本质上也是一个数组链表的形式存在,不同的点在于,每个dict中是可以存在…...
Java基础语法
注释 注释就是在程序指定位置添加的说明性信息 简单理解,就是对代码的一种解释 注释有三种: 单行注释 格式://注释信息 多行注释 格式:/*注释信息*/ 文档注释 格式:/**注释信息*/ 注释的注意事项…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
