python中类class的魔法方法
开始介绍之前,我们先看下之前文章我们介绍过的内置类merryview的一些方法,如下图所示: 有很多双下划线开始和结束的method,这么多method是做啥子用的呢?
其实这些方法就是我们常说的魔法方法,也是python中的特殊方法。它们以双下划线 __ 开始和结束,这些方法为 Python 类提供了丰富的功能。
以下开始介绍下常见的魔法方法:
1 构造方法
构造方法有__new__ __init__ __del__
__new__:如果设置了该方法,当我们定义类的实例时,该方法会被第一个调用,而不是先调用__init__方法。该方法需要返回一个类的实例。
__init__: 初始化类的实例属性,并可在该方法中定义其他一些属性或者调用其他函数等作为初始化的功能。
__del__: 当类实例对象销毁时会自动调用该方法。
举例:定义一个类,并做类的实例化
class Car(object):def __init__(self,brand,color,cost_performance):print('__init__被调用')self.brand = brandself.color = colorself.cost_performance = cost_performancedef __new__(cls, *args, **kwargs):print('__new__被调用')def __del__(self):print('__del__被调用')
实例化类:
car_ins = Car('BYD','black','high')
print(car_ins.brand)
当执行时,发现报错如下:只有__new__方法被调用了,而没有调用__init__,所以在打印实例属性时报错。
原因是__new__方法中没有返回对象实例。
我们在__new__方法中添加如下一行代码:super().__new__(cls)
def __new__(cls, *args, **kwargs):print('__new__被调用')return super().__new__(cls)
再次实例化类的时候
car_ins = Car('BYD','black','high')
print(car_ins.brand)
打印结果如下:
__new__被调用
__init__被调用
BYD
__del__被调用
解释:增加的这一行super().__new__(cls)作用就是调用基类object创建一个实例并返回,有了实例然后再调用__init__ 方法做初始化。当程序执行完成后,实例对象的内存会被释放,然后自动调用__del__方法。
2 类的表示方法
类的表示方法主要有__repr__ __str__
- __str__:当使用print函数打印对象实例或者str函数转换对象实例时,会调用该方法返回的字符串,如果没有该方法会继续找__repr__方法中的字符串信息
- __repr__:当使用repr函数打印对象实例时,会调用该方法返回的字符串,如果没有该方法会继续找__str_方法中的字符串信息
举例:
class Car(object):def __init__(self,brand,color,cost_performance):print('__init__被调用')self.brand = brandself.color = colorself.cost_performance = cost_performancedef __str__(self):print('__str__被调用')return '我是Car类'def __repr__(self):print('__repr__被调用')return '我是Car类'
类实例化后,打印下类实例:
car_ins = Car('BYD','black','high')
print(car_ins)
print(str(car_ins))
print(repr(car_ins))
结果:
__str__被调用
我是Car类
__str__被调用
我是Car类
__repr__被调用
我是Car类
3 上下文管理器方法
通过定义一个类,并实现__enter__()和__exit__()方法,那么这个类就可以被称为上下文管理器,也就可以使用with as的语句。
__enter__()方法:返回一个值,可以将它赋值给with...as后面的对象。
__exit__()方法: with...as 语句退出或者发送异常时会执行这个方法。
比如之前我们的文章讲到open函数我们经常会用到上下文管理器:
with open('test.txt','r') as fd:content = fd.readlines ()
4 可迭代对象和迭代器方法
方法有 __iter__ __next__
- 可迭代对象:指python中可以用来迭代(支持for循环)的对象,比如常见的列表/元组/字典/字符串等,这些对象中都会定义__iter__魔法方法。
- 迭代器:指可以帮助我们迭代其他对象的一种对象。这类对象会定义__next__魔法方法,可通过next()函数获取迭代的结果。
可迭代对象不一定是迭代器,但迭代器肯定是可迭代对象。因为迭代器要求必须同时实现__iter__方法和__next__方法, 而一旦实现了__iter__方法就必然是一个可迭代对象。但是反过来则不成立,可迭代对象可以不是迭代器。
1)判断对象是可迭代对象和迭代器
在python模块中先导入Iterable和Iterator。
from typing import Iterable,Iterator
或者
from collections.abc import Iterable,Iterator
通过isinstance(Object, Iterable)可判断一个对象是否是可迭代对象
通过isinstance(Object, Iterator)可判断一个对象是否是迭代器
2)常见的列表等是可迭代对象,但不是迭代器。
#定义一个列表
listA = [1,4,3,2]
print(f'列表是否是迭代对象 :{isinstance(listA,Iterable)}')
print(f'列表是否是迭代器 {isinstance(listA,Iterator)}')
#结果:
列表是否是迭代对象 :True
列表是否是迭代器 False
python安装好后有个自带的模块builtins.py,找到定义的list类,会发现该类中定义了__iter__方法,没有定义__next__方法。
class list(object):"""Built-in mutable sequence.If no argument is given, the constructor creates a new empty list.The argument must be an iterable if specified."""def append(self, *args, **kwargs): # real signature unknown""" Append object to the end.....def __iter__(self, *args, **kwargs): # real signature unknown""" Implement iter(self). """pass
使用next()执行列表会报错列表不是一个迭代器。
next(listA)
#会报错如下
Traceback (most recent call last):
File "test.py", line 9, in <module>
next(listA)
TypeError: 'list' object is not an iterator
3)使用iter()将可迭代对象转换为迭代器
还是以上面的列表举例,使用iter()将列表转换为迭代器。
list_iter = iter(listA)
print(f'列表使用iter()后是否是迭代对象 :{isinstance(list_iter,Iterable)}')
print(f'列表使用iter()是否是迭代器 {isinstance(list_iter,Iterator)}')
#打印结果
列表使用iter()后是否是迭代对象 :True
列表使用iter()是否是迭代器 True
5 容器方法
容器方法主要有__len__ __getitem__ __setitem__ __delitem__ __contains__ __reversed__
- __len__(self ): 获取容器中元素的数量,配合len() 函数使用。
- __getitem__(self, index): 获取容器中的元素值,index表示容器中的索引。
- __setitem__(self, index, value): 设置容器中的元素值,index表示容器中的索引,value表示要设置的值。
- __delitem__(self, index): 删除容器中的元素,index表示容器中的索引。
- __contains__(self, item): 判断容器中是否包含某个元素,使用in 判断。
- __reversed__(self): 当使用reversed() 内建函数会调用该方法,定义为返回一个反转之后的序列。
举例:自定义一个列表对象,并初始化一个传入的列表
class MyList(object):def __init__(self,newlist):self.newlist = newlistdef __len__(self):print('使用了__len__')return len(self.newlist)def __getitem__(self,index):print('使用了__getitem__')return self.newlist[index]def __setitem__(self, index, value):print('使用了__setitem__')self.newlist[index] = valuedef __delitem__(self, index):print('使用了__delitem__')del self.newlist[index]def __contains__(self, item):print('使用了__contains__')return item in self.newlistdef __reversed__(self):print('使用了__reversed__')return reversed(self.newlist)
对自定义列表对象进行增删改查时,会用到上述魔法方法:
先初始化实例:
mylist1 = MyList([1,2,3,4,5])
1)获取元素个数:
print(f'初始元素个数:{len(mylist1)}')
结果:
使用了__len__
初始元素个数:5
2)获取元素值
print(f'index为1的值:{mylist1[1]}')
结果:
使用了__getitem__
index为1的值:2
3)设置元素值
mylist1[0] = 100
print(f'index为0的值:{mylist1[0]}')
结果:
使用了__setitem__
使用了__getitem__
index为0的值:100
4)删除元素的值
del mylist1[-1]
print(f'删除最后一个元素后列表为:{list(mylist1)}')
结果:
使用了__delitem__
使用了__len__
使用了__getitem__
使用了__getitem__
使用了__getitem__
使用了__getitem__
使用了__getitem__
删除最后一个元素后列表为:[100, 2, 3, 4]
5)判断是否包含某个元素
print(f'判断数字2是否在列表内:{2 in mylist1}')
结果:
使用了__contains__
判断数字2是否在列表内:True
6)反转序列
print(list(reversed(mylist1)))
结果:
使用了__reversed__
[4, 3, 2, 100]
6 比较方法
比较方法主要有__eq__ __lt__ __le__ __gt__ __ge__ __ne__
- __eq__(self, other):定义等于操作符(==)的行为。
- __ne__(self, other):定义不等于操作符(!=)的行为。
- __lt__(self, other):定义小于操作符(<)的行为。
- __gt__(self, other):定义大于操作符(>)的行为。
- __le__(self, other):定义小于等于操作符(<=)的行为。
- __ge__(self, other):定义大于等于操作符(>=)的行为。
举例:定义一个类,初始化时随机生成一个整数。
import random
class rnum(object):def __init__(self,num):self.num = random.randint(0,num)def __eq__(self,other:int):print('使用了__eq__')return self.num == otherdef __le__(self,other:int):print('使用了__getitem__')return self.num <= otherdef __ge__(self, other:int):print('使用了__ge__')return self.num >= otherdef __lt__(self, other:int):print('使用了__lt__')return self.num < otherdef __gt__(self, other:int):print('使用了__gt__')return self.num > otherdef __ne__(self,other:int):print('使用了__ne__')return self.num != other
初始化类,传入数字10,并将对象做比较运算。
newnum = rnum(10)
print(f'newnum.num = {newnum.num}')
#比较对象值的数字7的大小
print(f'判断== : {newnum == 7}')
print(f'判断>= : {newnum >= 7}')
print(f'判断>= : {newnum >= 7}')
print(f'判断< : {newnum < 7}')
print(f'判断> : {newnum > 7}')
print(f'判断!= : {newnum != 7}')
#结果:
newnum.num = 1
使用了__eq__
判断== : False
使用了__ge__
判断>= : False
使用了__ge__
判断>= : False
使用了__lt__
判断< : True
使用了__gt__
判断> : False
使用了__ne__
判断!= : True
7 算术方法
常用到的算术方法如下:
__add__(self, other):实现加法+操作。
__sub__(self, other):实现减法-操作。
__mul__(self, other):实现乘法*操作。
__floordiv__(self, other):实现使用//操作符的整数除法。
__div__(self, other):实现使用/操作符的除法。
__mod__(self, other):实现%取余操作。
__divmod__(self, other):实现 divmod 内建函数。__pow__:实现冥运算**操作
__lshift__(self, other):实现左移位运算符<<。
__rshift__(self, other):实现右移位运算符>>。
__and__(self, other):实现按位与运算符&。
__or__(self, other):实现按位或运算符|。
__xor__(self, other):实现按位异或运算符^。
举例:定义一个类,初始化时随机生成一个整数。
import random
class rnum(object):def __init__(self,num):self.num = random.randint(0,num)def __add__(self,other:int):print('使用了__add__')return self.num + otherdef __sub__(self,other:int):print('使用了__sub__')return self.num - otherdef __mul__(self, other:int):print('使用了__mul__')return self.num * otherdef __floordiv__(self, other:int):print('使用了__floordiv__')return self.num // otherdef __mod__(self,other:int):print('使用了__mod__')return self.num % otherdef __divmod__(self,other:int):print('使用了__divmod__')return divmod(self.num,other)def __pow__(self,other:int):print('使用了__pow__')return self.num ** otherdef __lshift__(self,other:int):print('使用了__lshift__')return self.num << otherdef __rshift__(self,other:int):print('使用了__rshift__')return self.num >> otherdef __and__(self,other:int):print('使用了__and__')return self.num & otherdef __or__(self,other:int):print('使用了__or__')return self.num | otherdef __xor__(self,other:int):print('使用了__xor__')return self.num ^ other
初始化类,并计算如下:
1)按数值计算
newnum = rnum(100)
print(f'newnum.num = {newnum.num}')
print(f'加法: {newnum + 3}')
print(f'减法 : {newnum - 3}')
print(f'乘法 : {newnum * 3}')
print(f'//除法 : {newnum // 3}')
print(f'计算余数 : {newnum % 3}')
print(f'计算商和余数 : {divmod(newnum,3)}')
print(f'计算冥次 : {newnum ** 3}')
#结果
newnum.num = 41
使用了__add__
加法: 44
使用了__sub__
减法 : 38
使用了__mul__
乘法 : 123
使用了__floordiv__
//除法 : 13
使用了__mod__
计算余数 : 2
使用了__divmod__
计算商和余数 : (13, 2)
使用了__pow__
计算冥次 : 68921
2)按位进行计算:指转换为2进制后的一些计算
print(f'计算左移<< : {newnum << 3}')
print(f'计算右移>> : {newnum >> 3}')
print(f'计算位与& : {newnum & 3}')
print(f'计算位或| : {newnum | 3}')
print(f'计算位异或^ : {newnum ^ 3}')
#结果
使用了__lshift__
计算左移<< : 328
使用了__rshift__
计算右移>> : 5
使用了__and__
计算位与& : 1
使用了__or__
计算位或| : 43
使用了__xor__
计算位异或^ : 42
解释按位计算的示例:
print(f'数字41的2进制数:{bin(41)}')
print(f'2进制转为10进制数:{int("0b101001",base=2)}')#0b101001 整体往左移3位变成0b101001000
print(f'2进制转为10进制数:{int("0b101001000",base=2)}')#0b101001 整体往右移3位变成0b101
print(f'2进制转为10进制数:{int("0b101",base=2)}')#0b101001 与数字3(0b11) 做&的运算 得到0b000001
print(f'2进制转为10进制数:{int("0b000001",base=2)}')#0b101001 与数字3(0b11) 做|的运算 得到0b101011
print(f'2进制转为10进制数:{int("0b101011",base=2)}')#0b101001 与数字3(0b000011) 做^的运算 得到0b101010
print(f'2进制转为10进制数:{int("0b101010",base=2)}')
结果:跟上面按位运算的结果一致
数字41的2进制数::0b101001
2进制转为10进制数::41
2进制转为10进制数::328
2进制转为10进制数::5
2进制转为10进制数::1
2进制转为10进制数::43
2进制转为10进制数::42
补充知识:
- 按位左移:将一个数的各二进制位全部左移若干位,右边多出的位将用0填充。
- 按位右移:将一个数的各二进制位全部右移若干位,左边多出的位将用0填充。
- 按位与:只有当两个对应位都为1时,结果才为1,否则结果为0
- 按位或:只要有一个对应位为1时,结果就为1,都为0时结果为0
- 按位异或:相同为0,不同为1:如果两个比较的位相同,则结果为0;如果不同,则结果为1。
8 属性方法
关于属性相关的有以下方法:
__dir__(self):定义对类的实例调用 dir() 时的行为,返回一个属性列表。
__getattr__(self,name):当用户试图访问一个不存在的属性时,会调用该方法。
__setattr__(self,name,value):自定义某个属性的赋值时调用该方法。
__delattr__(self,name):删除某个属性时调用该方法。
举例:定义一个类以及上面的方法
class Car(object):def __init__(self,brand,color,cost_performance):print('__init__被调用')self.brand = brandself.color = colorself.cost_performance = cost_performancedef __dir__(self):print('__dir__被调用')return ['brand','color','cost_performance']def __getattr__(self, name):print('__getattr__被调用')return self.__dict__.get(name)def __setattr__(self,name,value):print('__setattr__被调用')self.__dict__[name] = valuedef __delattr__(self,name):print('__delattr__被调用')del self.__dict__[name]
类实例化
car_ins = Car('BYD','black','high')
1)返回实例的属性列表
print(dir(car_ins))
结果:
__dir__被调用
['brand', 'color', 'cost_performance']
2)返回实例的属性字典
print(car_ins.__dict__)
结果:
{'brand': 'BYD', 'color': 'black', 'cost_performance': 'high'}
3)获取某个属性
print(car_ins.other)
结果:因为没有该属性,所以返回为None
__getattr__被调用
None
4)设置属性
car_ins.other = 'xxx'
print(car_ins.__dict__)
结果:
__setattr__被调用
{'brand': 'BYD', 'color': 'black', 'cost_performance': 'high', 'other': 'xxx'}
5)删除属性
del car_ins.other
print(car_ins.__dict__)
结果:
__delattr__被调用
{'brand': 'BYD', 'color': 'black', 'cost_performance': 'high'}
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习和关注,谢谢大家。
相关文章:

python中类class的魔法方法
开始介绍之前,我们先看下之前文章我们介绍过的内置类merryview的一些方法,如下图所示: 有很多双下划线开始和结束的method,这么多method是做啥子用的呢? 其实这些方法就是我们常说的魔法方法,也是python中的…...

计算机体系结构和计算机组成原理的区别
如何理解计算机体系结构和计算机的组成?哪个对计算机的性能更重要?说明理由 目录 计算机体系结构 计算机组成 二者区别 哪个对性能更重要 计算机体系结构 计算机体系结构是指根据属性和功能不同而划分的计算机理论组成部分及计算机基本工作原理、理论…...

MySQL--数据库备份
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、为什么要备份 备份:能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。 冗余&#…...

influxDB的常用命令
目录 1.查看数据库命令 2.进入某数据库命令 3.创建表的命令 (host 和region 字段是必须的) 4.显示所有的表命令 5. 删除表 6.查询表数据 7.显示数据库用户 8.创建用户 9.创建管理员用户 10.修改密码(密码用单引号括住,不要用双引号) 11. 分配数据库访问权…...

使用 1panel面板 部署 springboot 和 vue
代码仓库:还没弄 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名(可跳过)3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件(服务器和面板开放端口)7. 打包并上传项目7.1 打包 Java项目&#…...

快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型(曙光超算互联网平台异构加速卡DCU)
序言 本文以 LLaMA-Factory 为例,在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE,私有化部署Llama3模型,并对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并。 快速体验基础版本,请参考另一篇博客:快…...

Cocos Creator 3.8.x bundle设置最佳方案
A: 项目开始场景(Start Scene)加载显示最快的Bundle设置方案:不要使用resources文件夹,除了项目开始场景(Start Scene)所在文件夹,将所有文件分类设置成Bundle; B: A方案较为麻烦,项目文件夹多时…...

【论文笔记】4D Millimeter-Wave Radar in Autonomous Driving: A Survey
原文链接:https://arxiv.org/abs/2306.04242 I. 引言 传统毫米波雷达(3D毫米波雷达)测量俯仰角的能力有限,数据通常仅包括距离、水平角和多普勒速度信息。此外,3D雷达数据存在噪声且分辨率低(尤其是水平角…...

搭建 Rancher 服务,配置k8s集群
1. 前提条件 前提条件: 安装docker,要求版本各节点版本一致。网上还有额外的要求:关闭swap、禁用selinux等等。 2. 搭建 Rancher 服务 直接通过docker命令实现即可,很方便。 docker run -d \--name rancher \--restart unles…...

数据恢复的定制之旅:打造SQL Server的专属恢复方案
数据恢复的定制之旅:打造SQL Server的专属恢复方案 在企业运营中,数据的安全性和可靠性是至关重要的。SQL Server作为企业级数据库解决方案,提供了多种数据恢复技术以应对不同的数据丢失场景。然而,面对特定的业务需求和复杂的数…...

Javascript常见算法详解
在JavaScript(JS)中,常见的算法涵盖了多个领域,从基础的数组操作到更复杂的排序、搜索和数据结构算法。下面是一些在JS中常见的算法示例: 1. 排序算法 Java排序算法-CSDN博客 冒泡排序(Bubble Sort&#x…...

MySQL数据管理 - 查询语句
文章目录 查询数据1 查询指定列2 条件查询3 合并查询4 模糊查询5 聚合函数查询6 对值进行排序7 分组查询8 分页查询9 数据库关联查询1 内连接 INNER JOIN2 LEFT JOIN3 右连接 10 数据库子查询参考 查询数据 数据库最常用的操作就是查询,也是数据操作的基础…...

经典图论算法回顾之Bellman-Ford算法
Dijkstra最短路径算法存在的一个问题是不能处理负权图(详见:经典图论算法回顾之Dijkstra算法。今天要回顾的Bellman-Ford算法(wikipedia:Bellman–Ford algorithm)可以求出有负权图的最短路径,并可以对最短…...

LinuxC++(10):调用可执行程序
认识system函数 可以直接用system在代码中实现调用shell命令 /bin/ls -l /tmp表示执行ls -l命令,打开/tmp地址 而前面的/bin/表示这是shell命令,不可少,可以认为,/bin/后面的就是等价于shell里面输入的命令。 然后,cou…...

C语言指针·高级用法超详解(指针运算、野指针、悬空指针、void类型指针、二级以及多级指针)
目录 1. 指针的运算 2. 野指针和悬空指针 2.1 野指针 2.2 悬空指针 3. void类型指针 4. 二级指针和多级指针 4.1 命名规则 4.2 作用 4.2.1 二级指针可以操作一级指针记录的地址 4.2.2 利用二级指针获取变量中记录的数据 1. 指针的运算 文章开始前可以先了…...

SQL注入:MySQL元数据库,外网实战手工SQL注入
MySQL元数据库 MySQL的元数据库是一组特殊的数据库,用于存储MySQL服务器的元数据信息,在sql注入中较为常用为以下两种元数据库: information_schema:这个数据库包含了MySQL服务器上所有其他数据库的元数据信息。例如数据库名、表…...

接口与抽象类有什么区别
接口:只能包含抽象方法,成员变量只能是public static final 类型 是对行为的抽象 先约定再接口再实现 抽象类:包含成员变量和一般方法和抽象方法,当继承时,子类必须实现抽象类中的抽象方法...

【时时三省】unity test 测试框架 使用 code blocks 移植(核心文件:unity.c, unity_fixture.c)
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 目录 1,移植介绍 2,使用 Code::Blocks 17.12 创建工程 3,搬移文件入工程目录 4,更改代码 5,向工程添加文件 6,运…...

安装Docker以及安装过程中的错误解决
一、纯享版教程+操作截图 环境:centOs 7 FinalShell !!!此教程针对第一次安装docker的友友,如果已经安装过且报错的朋友,请移步报错合集。 1.卸载旧版本(无论是否安装过都建议执…...

PXE实验
实验前准备 关闭VMware的dhcp 点击 编辑 点击 虚拟网络编辑器 选择 NAT模式 将dhcp取消勾选 准备两台虚拟机 一台试验机,(网络环境正常并且有图形化的界面的rhel7) 一台测试机 init 5 --------------> 开启图形化界面 如…...

Spring - 解析 统一数据格式返回以及统一异常处理
接上篇文章的统一数据格式返回… 文章目录 1. 统一异常处理1.1 使用 2. 统一数据返回和统一异处理是怎么实现的2.1 initHandleAdapters2.2 initHandleExceptionResolvers 1. 统一异常处理 1.1 使用 统一异常处理的两个关键的注解是ControllerAdvice ExceptionHandler Contro…...

用Manim实现——计算和绘制图形下方区域
用Manim实现——计算和绘制图形下方区域 get_area 函数 get_area是一个用于计算和绘制图形下方区域的函数,常用于图形动画库(如 Manim) get_area(graph, x_rangeNone, color(ManimColor(#58C4DD),ManimColor(#83C167)), opacity0.3, bounde…...

MySQL 保姆级教程(十五): 组合查询
第 17 章 组合查询 17.1 组合查询 MySQL 允许执行多个查询(多条 SELECT 语句),并将结果作为单个查询集返回 17.2 创建组合查询 可用 UNION 操作符来组合数条 SQL 查询 17.2.1 使用 UNION 输入: SELECT user.USER FROM user UNION SELEC…...

《动手做科研》06. 如何产生新的研究想法
地址链接:《动手做科研》06. 如何产生新的研究想法 欢迎加入我的知识星球,定期分享AI论文干货知识! 导读: 提出好的研究想法是相当困难的,特别是当你刚接触一个领域时——这需要对文献中的空白有所了解。然而,产生研究想法的过程可…...

【Kubernetes】Deployment 的状态
Deployment 的状态 Deployment 控制器在整个生命周期中存在 3 3 3 种状态: 已完成(Complete)进行中(Progressing)失败(Failed) 通过观察 Deployment 的当前特征,可以判断 Deploym…...

新手学习Gazebo+ros仿真控制小车-----易错和自己理解
赵虚左老师讲的很详细,这里只是理一下思路,说下突然出现“新”概念之间的关系。 urdf文件:里面是配置模型的,既有模型的位置、尺寸、颜色,也包含复杂的物理模型信息比如:转动惯量,碰撞box大小等等ÿ…...

jdbc(mysql)
1.概述 jdbc:java database connection(java与数据库连接) java可以连接不同数据库,不同数据库连接细节不同,具体细节都由数据库自己实现 由java设计出一系列连接数据库的接口规范,然后由不同的数据库开发…...

【Linux】搜索log在哪个文件中执行的方法
在Linux中,如果你需要找到包含特定文本(比如一段log)的文件,你可以使用grep命令结合一些其他工具来实现这一目的。这里有几个方法可以帮助你找到包含特定log内容的文件。 1. 使用grep直接在特定目录或文件中搜索 如果你知道log大…...

web小游戏开发:2048(完)移动操作及动画效果
web小游戏开发:2048(完)移动操作及动画效果 添加随机数字游戏开始时的初始化显示分数移动和合并获取行列元素下标记录移动轨迹完整的 js小结添加随机数字 书接前文,我们在前边定义了一个 move 方法,暂时先往后放放。 在我们已经初始化好的界面上,我们需要先制作一个出现…...

Redis学习笔记——第20章 Lua脚本
第20章 Lua脚本 20.1 创建并修改Lua环境 20.1.1 创建Lua环境 服务器创建一个新的基本的Lua环境 20.1.2 载入函数库 修改Lua环境,载入一些库函数 20.1.3 创建redis全局表格 全局变量,支持在Lua脚本中执行redis命令 20.1.4 使用redis自制随机函数来…...