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

python面向对象

面向对象简介

python完全采用了面向对象的思想,是真正面向对象的变成语言,完全支持面向对象的基本功能,例如:继承、多态、封装等

python中,一切皆为对象。前面学习的数据类型、函数等都是对象

面向过程和面向对象思想

面向过程和面向对象的区别

面向过程和面向对象都是对软件分析、设计和开发的一种思想,它知道着人们以不同的方式去分析、设计和开发软件。C语言是一种典型的面向过程语言,java是一种典型的面向对象语言。

面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。但是,具体到实现部分的围观操作(就是一个个方法),仍然需要面向过程的思路去处理。我们千万不要把面向过程和面向对象队里起来。他们是相辅相成的。面相对象离不开面向过程!

面向对象和面向过程总结

  1. 都是解决问题的思维方式,都是代码组织的方式
  2. 面向过程是一种“执行者思维”,解决简单问题可以使用面向过程
  3. 面向对象时一种“设计者思维”,解决复杂、需要协作的问题可以使用面向对象

类的定义

类可以看做是一个模版或者图纸,系统根据类的定义来造出对象。

类:我们叫做class。对象:我们叫做object,instance(实例)

python中,“一切皆为对象”。类也称为“类对象”,类的实例也称为“实例对象”。

定义类的语法格式如下:

class Student(object):def __init__(self, name, score, *jineng):self.name = nameself.score = scoreself.skill = jinengdef say_score(self):print("{}的分数为{}".format(self.name, self.score))def attack(self, skill):print("{}使用了{}技能".format(self.name, skill))def main(self):"""整个对象的主函数:return:"""oder = input("请输入你要使用的技能1.九阴白骨爪,2.六脉神剑")if oder == 1:self.attack(self.skill[0])else:self.attack(self.skill[1])if __name__ == '__main__':student1 = Student("张三", 19, '九阴白骨爪', '六脉神剑')# print(student1.skill[0])student1.main()

python对象完整内存结构

类是抽象的,也称为“对象的模版”。

__init__构造方法和__new__方法

初始化对象,我们需要定义构造函数__init__()方法。构造方法用于执行“实例对象的初始化工作”,即对象创建后,初始化当前对象的相关属性,无返回值。

class CarFactory(object):__obj = None__init_flag = Truedef __new__(cls, *args, **kwargs):if cls.__obj == None:cls.__obj = object.__new__(cls)return cls.__objdef __init__(self):if CarFactory.__init_flag:print("init.....")CarFactory.__init_flag = Falsedef createCar(self, brand):if brand == "奔驰":return Benz()elif brand == "宝马":return BMW()elif brand == "比亚迪":return BYD()else:return "位置品牌,无法创建"

在 Python 中,cls 和 self 的作用是不同的。

  • self: 代表当前对象的实例。通常在实例方法中使用,以访问实例的属性和方法。

  • cls: 代表当前类,通常在类方法或特殊方法(如 __new__)中使用,以访问类的属性和方法。

在你提供的代码中,cls 用于 __new__ 方法,表示当前类 MySingleton,而不是类的实例。这是用来创建类的实例而不是访问特定实例的属性。

所以,虽然两者的角色有相似之处(都是引用),但 cls 和 self 是在不同的上下文中使用的。

从GPT-4o获取更智能的答案

实例属性

实例属性是从属于实例对象的属性,也称为“实例变量”。他的使用有如下几个要点:

  1. 实例属性一般在__init__()方法中通过如下代码定义:
    self.实例属性名=初始值
  2. 在本类的其他实例方法中,也是通过self进行访问
    self.实例属性名
  3. 创建实例对象后,通过实例对象访问:
    obj01=类名()
    obj01.实例属性名=值

实例方法

函数和方法的区别

  1. 都是用来完成一个功能的语句块,本质一样。
  2. 方法调用时,通过对象来调用。方法从属于特定实例对象,普通函数没有这个特点
  3. 直观上看,方法定义时需要传递self,函数不需要

实例对象的方法调用本质

class Student(object):def __init__(self, name, score, *jineng):self.name = nameself.score = scoreself.skill = jinengdef say_score(self):print("{}的分数为{}".format(self.name, self.score))def attack(self, skill):print("{}使用了{}技能".format(self.name, skill))def main(self):"""整个对象的主函数:return:"""oder = input("请输入你要使用的技能1.九阴白骨爪,2.六脉神剑")if oder == 1:self.attack(self.skill[0])else:self.attack(self.skill[1])if __name__ == '__main__':student1 = Student("张三", 19, '九阴白骨爪', '六脉神剑')# print(student1.skill[0])Student.attack(student1, '九阴白骨爪')student1.main()

其他操作

  1. dir(obj)可以获得对象的所有属性、方法
  2. obj.__dict__对象的属性字典
  3. pass空语句
  4. isintance(对象,类型)判断对象是不是指定类型

类属性

类属性是从属于“类对象”的属性,也称为“类对象”。由于,类属性从属于类对象,可以被所有实例对象共享

类属性的定义方式:

class 类名:类变量名=初始值

在类中或者类的外面,我们可以通过:类名.类变量名来读写

内存分析实例对象和类对象创建过程

class Student(object):company = "重庆交通大学"  # 类属性count = 0  # 类属性def __init__(self, name, score):self.name = name  # 实例属性self.score = scoreStudent.count = Student.count + 1def say_score(self):  # 实例方法print("我的公司是:", Student.company)print(self.name, '的分数为:', self.score)if __name__ == '__main__':s1 = Student('王总', 80)  # s1是实例对象,自动调用__init__()方法s2 = Student('张三', 70)s1.say_score()print('一共创建了{}个Student对象'.format(Student.count))

类方法

类方法是从属于“类对象”的方法。类方法通过装饰器@classmethod来定义,格式如下:

@classmethod
def 类方法(cls [,形参列表]):方法体

注意事项

  1. @classmethod必须位于方法上面一行
  2. 第一个cls必须有;cls指的就是“类对象”本身
  3. 调用类方法格式:类名.类方法名(参数列表)。参数列表中,不需要也不能给cls传值
  4. 类方法中访问实例属性和实例方法会导致错误
  5. 子类继承父类方法时,传入clsshi子类对象,而非父类对象

对于类方法不可用实例对象中的数据。!!!

静态方法

python中允许定义与“类对象”无关的方法,称为“静态方法”

“静态方法”和在模块中定义的普通函数没有区别,只不过“静态方法”放到了“类的名字空间里面”,需要通过“类调用”。

在 Python 中,staticmethod 函数是一种装饰器,用于将函数转换为静态方法。静态方法与实例方法和类方法不同,它们不需要类实例作为第一个参数,也不需要类作为第一个参数,因此可以在不需要访问类或实例属性的情况下调用。

静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def 静态方法名([形参列表]):方法体

注意事项:

  1. @staticmethod必须位于方法上面一行
  2. 调用静态方法格式:类名.静态方法名(参数列表)
  3. 静态方法中访问实例属性和实例方法会导致错误

静态对象也不能使用实例对象的数据!!!

class Student(object):company = "SXT"  # 类属性def __init__(self, name):self.name = name@classmethoddef printCompany(cls):print("这个学生的company属性为:", cls.company)@staticmethoddef add(a, b):print("{}+{}={}".format(a, b, a + b))return a + bif __name__ == '__main__':sum = Student.add(10, 20)print(sum)student = Student('李阳')student.add(10, 20)

__del__()

__del__()称为“析构方法”,用于实现对象被销毁时所需的操作。比如:释放对象占用的资源,例如:打开的文件资源,网络连接等。

python实现自动的垃圾回收,当对象没有被引用时(引用计数为0),有垃圾回收器调用__del__()

我们也可以通过del语句删除对象,从而保证调用__del__()。

系统会自动提供__del__方法,一般不需要自定义析构方法。

call方法和可调用对象

  1. python中,凡是可以将()直接应用到自身并执行,都称为可调用对象。
  2. 可调用对象包括自定义的函数、Python内置函数。
  3. 定义了__call__()的对象,称为“可调用对象”,即该对象可以像函数一样被调用
  4. 该方法使得实例对象可以调用普通函数那样,以“对象名()的形式使用”
class Car(object):def __init__(self, age, money):self.money = moneyself.age = agedef __call__(self, age, money):print("call方法")print("车龄{0}\n金额{1}".format(age, money))def say_money(self):print("常规方法")print("车龄{0}\n金额{1}".format(self.age, self.money))if __name__ == '__main__':car = Car(3, 200000)car.say_money()print()car(3, 20000)#使用了call函数,可以使实例对象能够像函数名一样调用

方法没有重载

如果我们在类体中定义了多个重名的方法,只有最后一个方法有效

建议:不要使用重名的方法!python中方法没有重载

  • 在其他一些语言(比如:java)中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含3个部分:方法名、参数数量、参数类型。
  • python中,方法的参数没有声明类型(调用时确定参数的类型),参数的数量也可以由可变参数控制。因此,python中没有方法的重载
# python中没有方法的重载。定义多个同名的方法,只有最后一个有效
class Person(object):name = '李阳'def say_hi(self):print("hello")def say_hi(self):print("{},hello".format(self.name))if __name__ == '__main__':person = Person()person.say_hi()

方法的动态性

python是动态语言,我们可以动态的为类添加新的方法,或者动态的修改类的已有方法

# python中没有方法的重载。定义多个同名的方法,只有最后一个有效
class Person(object):name = '李阳'def say_hi(self):print("hello")def say_hi(self):print("{},hello".format(self.name))if __name__ == '__main__':person = Person()person.say_hi()

为什么这里的对象外部函数,需要传入参数self,但是在对象调用函数的时候为什么不需要传入参数。因为这里person.say_h1()实际上是默认传入了person一个实例对象。

私有属性和私有方法(实现封装)

python对于类的成员没有严格的访问控制限制,这于其他面向对象语言有区别。关于私有属性和私有方法,有如下要点:

  1. 通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
  2. 类内部可以访问私有属性(方法)
  3. 类外部不能直接访问私有属性(方法)
  4. 类外部可以通过_类名_私有属性(方法)名访问私有属性(方法)
class Employee(object):__company = "重庆"  # 解释器运行时,把__company转成了_Employee__companydef __init__(self, name, age):self.name = nameself.__age = ageself.age = agedef say_company(self):print("我的公司是:", Employee.__company)print("我的年龄是:", self.__age)# print(dir(Employee))
print(Employee._Employee__company)
a = Employee("王总", 18)
a.say_company()
print("这是一个公共属性", a.age)
print("这是一个私有属性", a._Employee__age)

私有方法

class Employee(object):__company = "重庆"  # 解释器运行时,把__company转成了_Employee__companydef __init__(self, name, age):self.name = nameself.__age = ageself.age = agedef say_company(self):print("我的公司是:", Employee.__company)print("我的年龄是:", self.__age)def __work(self):print("我的工作就是玩!")# print(dir(Employee))
print(Employee._Employee__company)
a = Employee("王总", 18)
a.say_company()
a._Employee__work()
print("这是一个公共属性", a.age)
print("这是一个私有属性", a._Employee__age)

@property装饰器

@property是一个内置的装饰器,允许你通过方法来定义一个属性,使得你能够以访问属性的方式来调用方法。它通常用于控制属性的访问、修改和删除操作,同时隐藏一些复杂的实现细节。

@property主要用于帮助我们处理属性的读操作、写操作。对于某一个属性,我们可以直接通过:

emp1.salary=3000

如上的操作读操作、写操作。但是,这种做法不安全。比如,我需要限制薪水必须为1-10000的数字。这时候,我们就需要通过使用装饰器@property来处理

主要作用

  1. 简化属性访问:通过 @property 装饰器可以将方法转化为属性,使得用户在访问时无需直接调用方法,而是像访问普通属性一样使用。
  2. 封装逻辑:可以在属性的访问和修改过程中加入额外的逻辑,比如验证数据的有效性或进行其他计算。
  3. 提供只读属性:通过 @property 可以定义只读属性,避免直接修改某些敏感属性。
  4. 控制属性的读取、修改和删除:可以使用 @property 配合 @<property_name>.setter@<property_name>.deleter 来定义属性的设置器和删除器,控制属性的赋值和删除操作。
class Employee(object):def __init__(self, name, salary):self.name = nameself.__salary = salary@propertydef salary(self):print("薪资是:", self.__salary)return self.__salary@salary.setterdef salary(self, salary):if 0 < salary < 1000000:self.__salary = salaryelse:print("薪资录入错误!只能在0-100000之间!")@salary.deleterdef salary(self):print("Deleting salary...")del self.__salaryif __name__ == '__main__':emp1 = Employee('老高', 30000)print(emp1.salary)emp1.salary = 50000print(emp1.salary)del emp1.salaryprint(emp1.salary)

属性和方法命名总结

  1. _xxx:保护成员,不能用from module import *导入,只有类对象和子对象能访问这些成员。
  2. _xxx_:系统定义的特殊成员
  3. __xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外部可以通过对象名._类名__xxx这种特殊方法访问。python不存在严格意义的私有成员)

None对象的特殊性

None不是False,None不是0,None不是字符串。None和任何其他的数据类型比较永远返回False

a = None
if a is None and a == None:print("a是None")  # 会执行
if a==False or a==0:print("None不等于False")

if语句判断时,空列表、空字典、空元组、0等一系列表空和无的对象会被转换为Fasle

面向对象三大特征介绍

python是面向对象的语言,支持面向对象编程的三大特性:继承、封装(隐藏)、多态

封装(隐藏)

隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装起来”,只对外暴露“相关调用方法”。

通过前面学习的“私有属性、私有方法”的方式、实现“封装”。python追求简洁语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现

继承

继承可以让子类具有父类的特性,提高了代码的重用性

从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新的功能,或者改进已有的算法。

多态

多态指同一个方法调用由于对象不同会产生不同的行为。生活中这样的例子比比皆是;同样是休息方法,人不同休息方法不同。张三休息是睡觉,李四休息是玩游戏,程序员休息是“敲几行代码”。

继承

继承是面向对象编程的三大特征之一。继承让我们更加容易实现类的扩展,实现代码的重用,不用在重新发明轮子

如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度。已有的类,我们陈伟“父类或者基类”,新的类,我们称为“子类或者派生类”

语法格式

Python支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:

class 子类类名(父类1[,父类2,...])类体

如果在类定义中没有指定父类,则默认父类是object类。也就是说,object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__()

关于构造函数:

  1. 子类不重写__init__,实例化子类时,会自动调用父类定义的__init__。
  2. 子类重写了__init__时,实例化子类,就不会调用父类已经定义的__init__。
  3. 如果重写了__init__时,要继承父类的构造方法,可以使用super关键字,也可以使用如下格式调用:
class Student:passclass Car:#父类是objectpassclass Benz(Car):pass
class Person(object):def __init__(self, name, age):print("创建Person")self.name = nameself.age = agedef say_age(self):print("{0}的年龄为{1}岁".format(self.name, self.age))class Student(Person):def __init__(self, name, age, score):self.name = nameself.age = ageself.score = scores1 = Student("老王", 18, 90)
s1.say_age()
class Person(object):def __init__(self, name, age):print("创建Person")self.name = nameself.age = agedef say_age(self):print("{0}的年龄为{1}岁".format(self.name, self.age))class Student(Person):def __init__(self, name, age, score): #调用父类构造方法,可以使用如下两种方式:Person.__init__(self, name, age)#super(Student, self).__init__(name, age)print("创建Student类")self.score = scores1 = Student("老王", 18, 90)
s1.say_age()

类成员的继承和重写

  1. 成员继承:子类继承了父类除构造方法之外的所有成员,私有属性和私有方法也可以被继承
  2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”
class Person(object):def __init__(self, name, age):print("创建Person")self.name = nameself.__age = agedef say_age(self):print("{0}的年龄为{1}岁".format(self.name, self.__age))class Student(Person):def __init__(self, name, age, score):# Person.__init__(self, name, age)super(Student, self).__init__(name, age)print("创建Student类")self.score = scores1 = Student("老王", 18, 90)
s1.say_age()
class Person(object):def __init__(self, name, age):self.name = nameself.age = agedef say_age(self):print(self.name, "的年龄是:", self.age)def say_name(self):print("我是", self.name)class Student(Person):def __init__(self, name, age, score):Person.__init__(self, name, age)self.score = scoredef say_score(self):print(self.name, "的分数是:", self.score)def say_name(self):print("报告老师,我是", self.name)#父类方法的重写s1 = Student("老高", 15, 85)
s1.say_score()
s1.say_name()
s1.say_age()

查看类的继承层次结构

通过类的方法mro()或者类的属性__mro__可以输出这个类的继承层次结构

class A: pass
class B(A): pass
class C(B): pass
print(C.mro())

object根类

object类是所有类的父类,因此所有的类都有object类的属性和方法。我们显然有必要深入研究一下object类的结构。对于我们继续深入学习python很有好处

dir()查看对象属性

为了深入学习对象,先学习内置函数dir(),他可以让我们方便的看到指定对象所有的属性

class Person(object):def __init__(self, name, age):self.name = nameself.age = agedef say_age(self):print(self.name, "的年龄是:", self.age)obj = object()
print(dir(obj))s2 = Person("老高", 18)
print(dir(s2))
print(s2.say_age)
print(type(s2.say_age))

重写__str__()方法

class Person(object):def __init__(self, name, age):self.name = nameself.__age = agedef __str__(self):"""将对象转化成一个字符串描述,一般用于print方法:return:"""print("重写__str__方法")return "名字是:{0},年龄是{1}".format(self.name, self.__age)p = Person("老高", 18)
print(p)
s = str(p)

多重继承

python支持多重继承,一个子类可以有多个“直接父类”。这样,就具备了“多个父类”的特点。但是由于这样会被“类的整体层次”搞的异常复杂,尽量避免使用

class A(object):def aa(self):print("这是A的方法")class B(object):def bb(self):print("这是B的方法")class C(B, A):def cc(self):print("这是C的方法")if __name__ == '__main__':c = C()c.cc()c.bb()c.aa()

MRO方法解析顺序

Python支持多继承、如果父类中有相同名字的方法,在子类中没有指定父类名时,解释器将“从左向右”按顺序搜索。

MRO(Method Resolution Order):方法解析顺序。我们可以通过mro()方法获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找的。

class A(object):def aa(self):print("aa")def say(self):print("say AAA!")class B(object):def bb(self):print("bb")def say(self):print("say BBB!")class C(B, A):def cc(self):print("cc")c = C()
print(C.mro())  # 打印类的层次结构
c.say()  # 解释器寻找方法是“从左到右”的方式寻找,此时会执行B类中的say()

super()获得父类的定义

class A(object):def __init__(self):print("A的构造方法")def say(self):print("A:", self)print("say AAA")class B(A):def __init__(self):super(B, self).__init__()#调用父类的构造方法print("B的构造方法")def say(self):#A.say(self) 调用父类的say方法super(B, self).say()#通过super()调用父类的方法print("say BBB")b=B()
b.say()

多态

多态是指同一个方法调用由于对象不同可能会产生不同的行为

比如:现实生活中,同一个方法,具体实现会完全不同。比如:同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭

关于多态要注意一下2点:

  1. 多态是方法的多态,属性没有多态。
  2. 多态的存在有2个必要条件:继承、方法重写
class Animal(object):def shout(self):print("动物叫了一声")class Dog(Animal):def shout(self):print("小狗,汪汪")class Cat(Animal):def shout(self):print("小猫,喵喵喵")def animalShout(animal):animal.shout()  # 会产生多态,传入的对象不同,则调用的方法也不一样animalShout(Dog())
animalShout(Cat())

对象的浅拷贝和深拷贝

浅拷贝

python拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象

import copyclass MobilePhone(object):def __init__(self, cpu):self.cpu = cpuclass CPU(object):passc = CPU()
m = MobilePhone(c)print("浅拷贝")
m2 = copy.copy(m)  # 浅拷贝,m2是m对象的一个浅拷贝对象
print("m:", id(m))
print("m2:", id(m2))
print("m中的cpu:", id(m.cpu))
print("m2中的cpu:", id(m2.cpu))

深拷贝

使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象。源对象金额拷贝对象所有的子对象也不同。

import copyclass MobilePhone(object):def __init__(self, cpu):self.cpu = cpuclass CPU(object):passc = CPU()
m = MobilePhone(c)print("深拷贝...")
m3 = copy.deepcopy(m)  # 深拷贝
print("m", id(m))
print("m3", id(m3))
print("m中的cpu", id(m.cpu))
print("m3中的cpu", id(m3.cpu))

组合

除了继承,“组合”也能实现代码的复用!“组合”核心是“将父类对象作为子类的属性”。

class CPU(object):def calculate(self):print("正在计算,算个12345!")class Screen(object):def show(self):print("显示一个好看的画面,亮瞎你的钛合金眼")class MobilePhone(object):def __init__(self, cpu, screen):self.cpu = cpuself.screen = screenc = CPU()
s = Screen()
m = MobilePhone(c, s)
m.cpu.calculate()
m.screen.show()

设计模型

工厂模式实现

class Benz(object):passclass BMW(object):passclass BYD(object):passclass CarFactory(object):def createCar(self, brand):if brand == "奔驰":return Benz()elif brand == "宝马":return BMW()elif brand == "比亚迪":return BYD()else:return "位置品牌,无法创建"factory = CarFactory()
c1 = factory.createCar("奔驰")
c2 = factory.createCar("宝马")
print(c1)
print(c2)

单例模式实现

单例模式的核心作用就是确保一个雷只有一个实例,并且提供一个访问该实例的全局访问点。

单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久主流内存中,从而极大地降低开销

!!!单例模式有多重实现的方式,我们这里推荐重写__new__()的方法。

class MySingleton(object):__obj = None__init_flag = Truedef __new__(cls, *args, **kwargs):if cls.__obj == None:cls.__obj = object.__new__(cls)return cls.__objdef __init__(self, name):if MySingleton.__init_flag:print("初始化第一个对象...")self.name = nameMySingleton.__init_flag = Falsea = MySingleton("aa")
print(a.name)
b = MySingleton("bb")
print(b.name)

工厂和单例模式结合

class CarFactory(object):__obj = None__init_flag = Truedef __new__(cls, *args, **kwargs):if cls.__obj == None:cls.__obj = object.__new__(cls)return cls.__objdef __init__(self):if CarFactory.__init_flag:print("init.....")CarFactory.__init_flag = Falsedef createCar(self, brand):if brand == "奔驰":return Benz()elif brand == "宝马":return BMW()elif brand == "比亚迪":return BYD()else:return "位置品牌,无法创建"factory = CarFactory()
c1 = factory.createCar("奔驰")
c2 = factory.createCar("宝马")
print(c1)
print(c2)
factory2 = CarFactory()
print(factory)
print(factory2)

单例模式和工厂的结合,factory工厂只能创建一个实例对象,不能多创建,但是生产车的实力对象,可以多生产。

相关文章:

python面向对象

面向对象简介 python完全采用了面向对象的思想&#xff0c;是真正面向对象的变成语言&#xff0c;完全支持面向对象的基本功能&#xff0c;例如&#xff1a;继承、多态、封装等 python中&#xff0c;一切皆为对象。前面学习的数据类型、函数等都是对象 面向过程和面向对象思…...

【UI自动化测试】selenium八种定位方式

&#x1f3e1;个人主页&#xff1a;謬熙&#xff0c;欢迎各位大佬到访❤️❤️❤️~ &#x1f472;个人简介&#xff1a;本人编程小白&#xff0c;正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话&#xff0c;记得点赞&#x1f44d;、收藏⭐️、评论&#x1f4ac;&am…...

基于物联网疫苗冷链物流监测系统设计

1. 项目开发背景 随着全球对疫苗运输要求的提高&#xff0c;特别是针对温度敏感型药品&#xff08;如疫苗&#xff09;的冷链管理&#xff0c;如何保证疫苗在运输过程中的温度、湿度、震动等环境因素的稳定性已成为亟需解决的问题。疫苗运输过程中&#xff0c;任何温度或湿度的…...

实训云上搭建集群

文章目录 1. 登录实训云1.1 实训云网址1.2 登录实训云 2. 创建网络2.1 网络概述2.2 创建步骤 3. 创建路由器3.1 路由器名称3.1 创建路由器3.3 查看网络拓扑 4. 连接子网5. 创建虚拟网卡5.1 创建原因5.2 查看端口5.3 创建虚拟网卡 6. 管理安全组规则6.1 为什么要管理安全组规则6…...

【网页自动化】篡改猴入门教程

安装篡改猴 打开浏览器扩展商店&#xff08;Edge、Chrome、Firefox 等&#xff09;。搜索 Tampermonkey 并安装。 如图安装后&#xff0c;浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name&#xff1a;脚本名称。…...

(概率论)无偏估计

参考文章&#xff1a;(15 封私信 / 51 条消息) 什么是无偏估计&#xff1f; - 知乎 (zhihu.com) 首先&#xff0c;第一个回答中&#xff0c;马同学图解数学讲解得很形象&#xff0c; 我的概括是&#xff1a;“注意&#xff0c;有一个总体的均值u。然后&#xff0c;如果抽样n个&…...

JavaScript 正则表达式

JavaScript 正则表达式(RegEx)是一种强大的工具,用于在字符串中查找匹配的模式、替换文本,或者验证输入的格式。下面是一些常用的正则表达式操作和语法: 常用正则表达式符号: .:匹配任意字符(除了换行符)。^:匹配输入字符串的开始。$:匹配输入字符串的结束。[]:定…...

Swift语言的正则表达式

Swift语言的正则表达式 正则表达式是一种用于匹配字符串的强大工具&#xff0c;它可以帮助开发者在文本处理中高效地搜索和操作字符串。在Swift语言中&#xff0c;正则表达式的支持是通过Foundation框架提供的。本文将全面介绍Swift中的正则表达式&#xff0c;从基础知识到进阶…...

Matlab 数据处理与可视化的多元拓展应用(具体代码分析)

一、代码整体功能概述&#xff1a; 该代码主要实现了以下几个功能&#xff1a; 从文件&#xff08;part1.txt&#xff09;中读取数据&#xff0c;并提取第二列数据&#xff0c;将其存储在 originalColumnData 中。对原始数据进行可视化&#xff0c;包括绘制置零前数据的折线图…...

小程序与内嵌网页的数据通信

小程序与内嵌网页的数据通信 前言 微信小程序提供了web-view组件&#xff0c;允许开发者在小程序中嵌入网页。然而&#xff0c;由于小程序和网页运行在不同的环境中&#xff0c;它们之间的通信就需要依赖特定的机制来实现。然而我们日常的需求中&#xff0c;很多的时候都涉及…...

【学习笔记】数据结构(十一)

外部排序 文章目录 外部排序11.1 外存信息的存取11.2 外部排序的方法11.3 多路平衡归并的实现 - 增加k11.4 置换-选择排序 - 减少m11.5 最佳归并树 外部排序 指的是大文件的排序&#xff0c;即待排序的记录存储在外存储器 上&#xff0c;在排序过程中需进行多次的内、外存之间的…...

【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件

Logstash 过滤 Filter 插件 数据从源传输到存储库的过程中&#xff0c;Logstash 过滤器能够解析各个事件&#xff0c;识别已命名的字段以构建结构&#xff0c; 并将它们转换成通用格式&#xff0c;以便进行更强大的分析和实现商业价值。 Logstash 能够动态地转换和解析数据&a…...

深度学习模型部署——基于Onnx Runtime的深度学习模型CPU与GPU部署(C++实现)

1.概述 许多机器学习和深度学习模型都是在基于 Python 的框架中开发和训练的&#xff0c;例如 PyTorch 和 TensorFlow 等。但是&#xff0c;当需要将这些训练好模型部署到生产环境中时&#xff0c;通常会希望将模型集成到生产流程中&#xff0c;而这些流程大多是用 C 编写的&a…...

Selenium 的四种等待方式及使用场景

Selenium 的四种等待方式及使用场景 隐式等待&#xff08;Implicit Wait&#xff09;显式等待&#xff08;Explicit Wait&#xff09;自定义等待&#xff08;Custom Wait&#xff09;固定等待&#xff08;Sleep&#xff09; 1. 隐式等待 定义&#xff1a; 隐式等待是为 WebD…...

攻防世界 ics-07

点击之后发现有个项目管理能进&#xff0c;点进去&#xff0c;点击看到源码&#xff0c;如下三段 <?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); die(); } if (isset($_GET[page]) && $_GET[page] ! index.php) { include(flag.php);…...

一文读懂「LoRA」:大型语言模型的低秩适应

LoRA: Low-Rank Adaptation of Large Language Models 前言 LoRA作为大模型的微调框架十分实用&#xff0c;在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的&#xff0c;具有极大的盲目性&#xff0c;但是LoRA技术能够快速微调参数&#xff0c;如果LoRA…...

新车月交付突破2万辆!小鹏汽车“激活”智驾之困待解

首次突破月交付2万辆规模的小鹏汽车&#xff0c;稳吗&#xff1f; 本周&#xff0c;高工智能汽车研究院发布的最新监测数据显示&#xff0c;2024年11月&#xff0c;小鹏汽车在国内市场&#xff08;不含出口&#xff09;交付量&#xff08;上险口径&#xff0c;下同&#xff09…...

dockerfile 中 #(nop)

在 Dockerfile 中&#xff0c;#(nop) 通常出现在 docker history 命令的输出中。以下是对它的详细解释&#xff1a; 背景 当你使用 docker history <image_name> 命令查看 Docker 镜像的构建历史时&#xff0c;你可能会看到 #(nop) 这样的标记。这是因为 Docker 镜像由…...

升级 Spring Boot 3 配置讲解 —— 为何 SpringBoot3 淘汰了 JDK8?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 随着 Spring Boot 3 的发布&#xff0c;许多开发者发现了一个重要的变化&#xff1a;Spring Boot 3 不再支持 JDK 8。这一变化引发了不少讨论&#xff0c;尤其是对于那些仍然在使用 JDK …...

IT面试求职系列主题-人工智能(一)

想成功求职&#xff0c;必要的IT技能一样不能少&#xff0c;再从人工智能基础知识来一波吧。 1&#xff09;您对人工智能的理解是什么&#xff1f; 人工智能是计算机科学技术&#xff0c;强调创造能够模仿人类行为的智能机器。这里智能机器可以定义为能够像人一样行动、像人一…...

JVM 优化指南

JVM 优化指南 1. JVM 参数配置 1.1 基础参数配置 设置堆内存大小 -Xms2048m -Xmx2048m 设置新生代大小 -Xmn1024m 设置元空间大小 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m 设置线程栈大小 -Xss512k1.2 垃圾回收器配置 使用 G1 垃圾回收器 -XX:UseG1GC 设置期望停顿…...

windows下编写的shell脚本在Linux下执行有问题解决方法

前言&#xff1a; 这个问题在实际工作中经常会遇到(非语法错误)&#xff0c;脚本来源有些是自己在windows系统编写的、有些是从别人那里copy来的&#xff0c;还有些原本是好的被别人拿到windows下修改了一些内容&#xff0c;总之各种场景&#xff0c;但是如果是一个内容比较多的…...

使用 SQL 和表格数据进行问答和 RAG(6)—将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库

将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库。以下是详细代码逻辑&#xff1a; 1. 类结构 该类包含三个主要方法&#xff1a; _prepare_db&#xff1a;负责将文件夹中的 CSV 和 XLSX 文件转换为 SQL 表。_validate_db&#xff1a;用于验证 SQL 数据库中创建的表是否…...

【算法】算法大纲

这篇文章介绍计算机算法的各个思维模式。 包括 计数原理、数组、树型结构、链表递归栈、查找排序、管窥算法、图论、贪心法和动态规划、以及概率论:概率分治和机器学习。没有办法逐个说明,算法本身错综复杂,不同的算法对应着不同的实用场景,也需要根据具体情况设计与调整。…...

vue(2,3), react (16及以上)开发者工具资源

在前端开发的广阔领域中&#xff0c;Vue.js 和 React.js 作为两大主流框架&#xff0c;各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发&#xff0c;Vue Devtools 和 React 开发者工具应运而生&#xff0c;成为这两个框架不可或缺的辅助工具。本…...

系统编程(网络,文件基础)

网络链接 虚拟机和主机之间网络连接的主要模式有三种&#xff0c;分别是桥接模式&#xff08;Bridged&#xff09;、网络地址转换模式&#xff08;NAT&#xff09;以及主机模式&#xff08;Host-Only&#xff09;。以下是这三种模式的详细解释&#xff1a; 一、桥接模式&…...

重温设计模式--13、策略模式

策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来&#xff0c;使得算法可以独立于使用它的客户端而变化&#xff0c;提高了代码的灵活性和可维护性。 其主要包含以下几个…...

数字IC设计高频面试题

在数字IC设计领域&#xff0c;面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题&#xff0c;以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…...

C#异步多线程——ThreadPool线程池

C#实现异步多线程的方式有多种&#xff0c;以下总结的是ThreadPool的用法。 线程池的特点 线程池受CLR管理&#xff0c;线程的生命周期&#xff0c;任务调度等细节都不需要我们操心了&#xff0c;我们只需要专注于任务实现&#xff0c;使用ThreadPool提供的静态方法把我们的任…...

矩母函数(MGF)

矩母函数&#xff08;MGF&#xff09;简介 矩母函数&#xff08;Moment Generating Function&#xff0c;MGF&#xff09;是概率统计中描述随机变量分布特征的重要工具。MGF的主要用途是通过导数来计算随机变量的矩&#xff08;比如均值、方差等&#xff09;&#xff0c;同时它…...

【技术支持】安卓无线adb调试连接方式

Android 10 及更低版本&#xff0c;需要借助 USB 手机和电脑需连接在同一 WiFi 下&#xff1b;手机开启开发者选项和 USB 调试模式&#xff0c;并通过 USB 连接电脑&#xff08;即adb devices可以查看到手机&#xff09;&#xff1b;设置手机的监听adb tcpip 5555;拔掉 USB 线…...

OpenCV相机标定与3D重建(46)将三维空间中的点投影到二维图像平面上函数projectPoints()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将3D点投影到图像平面上。 cv::projectPoints 是 OpenCV 库中的一个函数&#xff0c;用于将三维空间中的点投影到二维图像平面上。这个过程涉及到…...

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题&#xff0c;同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉&#xff0c;是否想过为何需要这样分层&#xff1f; 网上大多都是介绍每一层…...

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…...

编译与汇编

本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析&#xff0c;语法分析&#xff0c;语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …...

Linux入门攻坚——43、keepalived入门-1

Linux Cluster&#xff08;Linux集群的类型&#xff09;&#xff1a;LB、HA、HPC&#xff0c;分别是负载均衡集群、高可用性集群、高性能集群。 LB&#xff1a;lvs&#xff0c;nginx HA&#xff1a;keepalived&#xff0c;heartbeat&#xff0c;corosync&#xff0c;cman HP&am…...

备考蓝桥杯:顺序表相关算法题

目录 询问学号 寄包柜 移动0 颜色分类 合并两个有序数组 物品移动 询问学号 我们的思路&#xff1a;创建一个顺序表存储从1开始依次存放进入教室的学生学号&#xff0c;然后查询 #include <iostream> #include <vector> using namespace std; const int N 2…...

【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)

视频演示: 基于STM32与QT的智慧粮仓环境监测与管理系统设计 目录: 目录 视频演示: 目录: 前言:...

Vue3 自定义hook

文章目录 Vue3 自定义hook概述用法 Vue3 自定义hook 概述 Vue3推荐利用Vue的组合式API函数进行代码封装&#xff0c;这种封装方式统称为自定义hook。 用法 定义 hook/countHook.js&#xff1a; import {computed, ref, watch} from "vue";export default (initC…...

【VBA】【EXCEL】将某列内容横向粘贴到指定行

Sub CopyRowToColumn()On Error GoTo ErrorHandler 添加错误处理Application.ScreenUpdating FalseApplication.Calculation xlCalculationManualApplication.EnableEvents False 禁用事件处理Dim lastCol As LongDim lastRow As LongDim i As Long, colCount As LongDim …...

使用Llama 3.1创建合成数据集以调优你的大型语言模型

使用Llama 3.1创建合成数据集以调优你的大型语言模型 在数据驱动的人工智能领域&#xff0c;数据是核心资产。开发高质量数据集既复杂又昂贵&#xff0c;因此很多实验室和开发者选择使用合成数据集。本文将介绍如何利用大型语言模型Llama 3.1 405B创建合成数据集&#xff0c;并…...

【Ubuntu22.04】VMware虚拟机硬盘扩容

1.首先打开虚拟机设置 2.根据需要对硬盘扩展 这边提示我们还需要进入虚拟机在内部分区 3.安装界面化磁盘管理工具 # 安装 sudo apt install gparted# 启动 sudo gparted调整硬盘大小 调整的时候会提示我们硬盘是只读的&#xff0c;因此还要进行操作 新建终端重新挂载文件系…...

初学stm32 --- DMA直接存储器

目录 DMA介绍 STM32F1 DMA框图 DMA处理过程 DMA通道 DMA优先级 DMA相关寄存器介绍 F1 DMA通道x配置寄存器&#xff08;DMA_CCRx&#xff09; DMA中断状态寄存器&#xff08;DMA_ISR&#xff09; DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09; DMA通道x传输…...

reactor中的并发

1. reactor中的并发有两种方式 1.1 flatmap&#xff0c;底层是多线程并发处理。在reactor的演讲中&#xff0c;flatmap对于io类型的并发效果较好. flamap有两个参数: int concurrency, int prefetch。分别代表并发的线程数和缓存大小 注意凡是参数中有prefetch的&#xff0c;都…...

HTML - <script>,<noscript>

<script>标签用于在网页插入脚本&#xff0c;<noscript>标签用于指定浏览器不支持脚本时的显示内容。 1.<script> <script>用于加载脚本代码&#xff0c;目前主要是加载 JavaScript 代码。 <script> console.log(hello world); </script&g…...

C#语言的函数实现

C#语言的函数实现 在现代编程语言中&#xff0c;函数&#xff08;Function&#xff09;是最基本也是最重要的组成部分之一。函数不仅提高了代码的复用性&#xff0c;还使得程序结构更清晰。C#作为一种多用途的编程语言&#xff0c;函数的知识是程序员必备的基本技能之一。本文…...

JAVA I/O流练习1

往D盘中的JAVA复习文件夹中写数据&#xff1a; 数据改了一下哈&#xff1a; import java.io.*; import java.util.Scanner; public class Test {public static void main(String[] args) throws IOException {String fileName"D:JAVA复习\\grade.txt";FileWriter w…...

HTML——75. 内联框架

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>内联框架</title><style type"text/css">iframe{width: 100%;height: 500px;}</style></head><body><!--iframe元素会创建包含…...

js获取当前浏览器地址,ip,端口号等等

前言&#xff1a; js获取当前浏览器地址&#xff0c;ip&#xff0c;端口号等等 window.location属性查询 具体属性&#xff1a; 1、获取他的ip地址 window.location.hostname 2、获取他的端口号 window.location.port 3、获取他的全路径 window.location.origin 4、获取…...

C++虚函数(八股总结)

什么是虚函数 虚函数是在父类中定义的一种特殊类型的函数&#xff0c;允许子类重写该函数以适应其自身需求。虚函数的调用取决于对象的实际类型&#xff0c;而不是指针或引用类型。通过将函数声明为虚函数&#xff0c;可以使继承层次结构中的每个子类都能够使用其自己的实现&a…...