Python语法进阶——类

Python中的数据类型都属于类。int、str、list都是Python定义好的数据类型类。

print(type(list))#<class 'type'>
print(type(list()))#<class 'list'>

 一、自定义数据类型

一、语法

class 类名():
    pass
#类名 要求首字母大写
#()可写可省略。
#pass在这里只是用来保证语法不报错,本来应该是类体

二、示例

class Person():
    pass

class Cat():
    pass

三、创建对象的语法格式

对象名=类名()
#对象名是一个变量名,数据类型是 该类的类型
#这个括号一定要加,不加的话相当于给类名起了一个临时别名

示例:

class Person:
    pass
p=Person()
y=Person
print(type(p),type(y),type(y()))
#<class '__main__.Person'> <class 'type'> <class '__main__.Person'>
#p是Person类型的对象,y是type类型的对象,类名就是一个type对象

 二、类的组成

__init__(self) 定义 实例方法,指定初始化类的参数(默认构造函数)

①类中的函数称为方法。

②实例属性和实例方法指的是根据不同的实例变量值和方法的结果是不同的。类属性是类固有的,每个实例都共用这一个属性。实例属性必须是在__init__中定义的。并且,实例属性在该初始化方法中定义之后,可以在整个类中用self.来使用。

③初始化方法指定了一个类在定义对象时需要传递的参数,self参数是对象自带的,不需要传入。如果不用指定实例属性,也可以没有初始化方法。

一、类属性和实例属性

类属性,使用类名打点调用,包括类内部也是如此。当然可以用实例属性的对象名打点调用。

class Student:
    #类属性:定义在类中的变量,方法外的变量
    school='Jlu'
    
    #初始化方法
    def __init__(self,name,age):#name和age是方法的参数,可以忽略,局部变量
        self.name=name
# self打点的 self.name是一个实例属性,name是局部变量,将局部变量的值赋值给实例属性
        self.age=age #实例属性的名称和局部变量的名称可以相同
        print(self.school)

实例属性,使用对象名打点调用

二、实例方法

class Student:
    #类属性:定义在类中的变量
    school='Jlu'
    
    #初始化方法
    def __init__(self,name,age):
        self.name=name
        self.age=age
    #实例方法
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了,来自{Student.school}')

 三、静态方法

静态方法是类有的,而不是实例有的,不能使用实例属性,也不能调用实例方法。

静态方法是也可以用对象打点调用,不可以用类打点调用的。

class Student:
    school='Jlu'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了')
        what() #×
    @staticmethod
    def what():
        print('This is a staticmethod')

stu=Student('22',2)
stu.show()  #√

四、类方法

class Student:
    school='Jlu'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了')
    @staticmethod
    def what():
        print('This is a staticmethod')
    @classmethod #这个@只作用于下面第一个函数
    def cm(cls):#cls是类方法自带的,正如实例方法自带self
        print('This is a classmethod')


stu=Student('22',2)
stu.cm()
Student.cm() #输出This is a classmethod

类方法可以通过类名来直接调用。也可以用对象名打点调用。

五、创建类对象

stu=Student('Yorelee',21)
#实例属性,使用对象名打点调用
print(stu.name,stu.age,Student.school)

#实例方法,使用对象名打点调用,除了self外,需要传入所需的参数
stu.show()

#类方法,使用类名打点调用,需要传入所需的参数
Student.cm()

#静态方法,使用类名打点调用,需要传入所需的参数
Student.what()

 六、示例

class Student:
    school='Jlu'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        print(f'我叫:{self.name},今年:{self.age}岁了')

#创建对象
stu1=Student('李泽斌',21)
stu2=Student('王一一',20)
stu3=Student('Jack Sparrow',40)
stu4=Student(age=23,name='Rose')
Student.school='Haffman'

#将对象存储列表当中
lst=[stu1,stu2,stu3,stu4]
for i in lst:
    print(i.name,i.age,end='-->')
    i.show()
print(Student.school)

'''
李泽斌 21-->我叫:李泽斌,今年:21岁了
王一一 20-->我叫:王一一,今年:20岁了
Jack Sparrow 40-->我叫:Jack Sparrow,今年:40岁了
Rose 23-->我叫:Rose,今年:23岁了
Haffman
'''

三、动态绑定属性和方法

stu=Student('yore',21)
stu1=Student('Sweet',20)

#动态绑定实例属性,直接 对象.实例属性名
stu.gender='男' #只为stu绑定了一个属性,stu1没有

def introduce():
    print('我是一个普通的函数,我被动态绑定成stu1对象的方法')

stu1.My_intro=introduce  #函数赋值
introduce()
stu1.My_intro()#很像是给了introduce一个别名 可以调用而已






'''这里像极了普通变量 和 普通函数变量的赋值,不过不一样的是这里用了对象.'''

 四、面向对象的三大特征

一、封装

单下划线开头:防君子不防小人

双下划线开头:表示私有成员,只允许本类访问。

首尾双下划线:特殊方法

class Student:
    def __init__(self,name,age,gender):
        self._name=name  #受保护的,只允许本类和子类访问
        self.__age=age #私有的,只能类本身去访问
        self.gender=gender  #普通实例属性,内外,子类都可以访问
    def _fun1(self):
        pass #子类和本身可以使用
    def __fun2(self):
        pass #只有定义的类可以访问
    def show(self): #普通的实例方法
        self._fun1()
        slef.__fun2()

与C++不一样,这里的私有成员是可以被访问的,在类外

对象名._类名__函数名/实例属性名。(不推荐使用)

print(dir(stu))#使用内置函数dir() 查看对象中的所有对象
#['_Student__age', '_Student__fun2', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_fun1', '_name', 'gender', 'show']

#你会发现,私有成员的名字变成了'_Student__age',还是可以使用!
#并且在实例方法里面还是可以调用私有成员,这和C++中强制不允许不一样
stu=Student('陈梅酶','21','女')
print(stu._Student__age)
stu._Student__fun2()
#可以这样访问的原理是,

属性的设置

使用装饰器@property,可以将方法转换成属性使用,这样可以使用私有成员。但是不可以修改。

使用装饰器@属性名.setter,可以修改私有成员

class Student:
    def __init__(self,name):
        self.__name=name
    @property
    def name(self):#装饰器修饰之后,在使用该函数时可以不加括号
        return self.__name
    
    @name.setter
    def name(self,value):
        if value=='霸道总裁':
            print("别搞")
        else:
            self.__name=value

stu=Student('Yore')
print(stu.name) #实际上是调用方法name(),所以不能修改值
stu.name='霸道总裁'
stu.name='王一一'

二、继承

子类可以使用父类的公有和保护部分内容。

如果子类只有一个父类可以使用super()来调用父类的方法。

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    
    def show(self):
        print(f'大家好,我是{self.name}')

class Student(Person):
    def __init__(self,name,age,stuno):
        super().__init__(name,age) #调用父类的初始化方法。
        self.stuno=stuno

class Doctor(Person):
    def __init__(self,name,age,deptname):
        super().__init__(name,age)
        self.deptname=deptname

stu=Student('yor',20,'0328')
stu.show()

doctor=Doctor('Doc.strange',20,'Com.Si.')
doctor.show()
import torch
import torch.nn as nn
'''----------------------生成器定义代码---------------------'''
class TriggerGenerator(nn.Module):#继承机器学习父类,拥有其公有内容和保护内容
    def __init__(self, input_size, output_size):
        super().__init__()#在Python3中,super()不需要指定类和self
        self.fc1 = nn.Linear(input_size, 128)
        self.fc2 = nn.Linear(128, output_size)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

多继承 

如果一个子类继承多个父类,用父类名来调用父类方法,需要传入self来指定子类对象。

class FatherA():
    def __init__(self,name):
        self.name=name
    def showA(self):
        print("I am FahterA")

class FatherB:
    def __init__(self,age):
        self.age=age
        print("PPAP")        

    def showB(self):
        print("B")

class Son(FatherA,FatherB):
    def __init__(self,name,age):
        FatherA.__init__(self,name)
        FatherB.__init__(self,age)

son=Son('陈梅酶',20)
son.showA()
son.showB()
'''
PPAP
I am FahterA
B
'''

方法重写

方法重写必须方法名称和父类方法名称相同才能重写。子类重写了先调用子类的,没重写调用父类的。

class FatherB:
    def __init__(self,age):
        self.age=age
        print("PPAP")

    def showB(self):
        print("B",end=' ')

class Son(FatherB):
    def __init__(self,name,age):
        FatherB.__init__(self,age)
    def showB(self):
        super().showB()
        print("is my father")

son=Son('陈梅酶',20)
son.showB()
'''
PPAP
B is my father
'''

三、多态

C++中的多态基于继承,虚机制。但是python中只关心方法,不关心继承,只关心运行时具体是哪个对象。

class Person:
    def eat(self):
        print("人喜欢吃五谷杂粮")

class Cat:
    def eat(self):
        print("猫喜欢吃鱼")
class Dog:
    def eat(self):
        print("狗喜欢啃骨头")

def fun(obj):
    obj.eat()

per=Person()
cat=Cat()
dog=Dog()

fun(per)
fun(cat)
fun(dog)
'''
人喜欢吃五谷杂粮
猫喜欢吃鱼
狗喜欢啃骨头
'''

五、object类

 

如果一个类没有父类,默认继承object类。

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        print(f'大家好,我叫:{self.name},我今年:{self.age}岁')



per=Person('wq',21)  #创建对象时,会自动调用__init__方法
print(dir(per)) #显示对象per的所有方法和属性,可以发现object类中的内容
'''
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'show']
'''

__new__()先执行 创建对象,开辟空间,然后执行__init__()给对象赋值,都是自动调用的。

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):#方法重写
        return "Love U U"
per=Person('l',2)
print(per) 
#如果子类没有进行方法重写,那么默认调用__str__()返回地址,否则调用方法重写的
print(per.__str__())#也可以显式调用

六、特殊方法和特殊属性

一、特殊方法

特殊方法前后有两个下划线,与开头双下划线的私有方法不同,这种特殊方法可以在类外调用。

a=10
#Python当中一切皆对象
print(dir(10))
print(a+10)
print(a.__add__(10))
print(a.__sub__(1))  #1.__sub__(1)是不行的
'''
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
20
20
'''

二、特殊属性 

obj.表示对象调用,实例属性。class.表示类调用,类属性。

层次结构表示的是都继承了谁,父类默认为第一个。

子类列表是方法,返回值为一个列表,并且只返回直属的儿子,孙子不在里面。

class A:
    school='JJ'
class B:
    pass
class D:
    school='J'
class C(A,B,D):
    def __init__(self,name,age):
        self.name=name
        self.age=age

a=A()
b=B()
c=C('Yore',20)

print('对象a的实例属性字典:',a.__dict__)
print('对象b的实例属性字典:',b.__dict__)
print('对象c的实例属性字典:',c.__dict__)
'''
对象a的实例属性字典: {}
对象b的实例属性字典: {}
对象c的实例属性字典: {'name': 'Yore', 'age': 20}
'''

print('对象a所属的类:',a.__class__)
print('对象b所属的类:',b.__class__)
print('对象c所属的类:',c.__class__)
'''
对象a所属的类: <class '__main__.A'>
对象b所属的类: <class '__main__.B'>
对象c所属的类: <class '__main__.C'>
'''

print(A.__bases__,A.__base__)
print(B.__bases__,B.__base__)
print(C.__bases__,C.__base__)
'''
(<class 'object'>,) <class 'object'>
(<class 'object'>,) <class 'object'>
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>) <class '__main__.A'>
'''
print(A.__mro__)
print(B.__mro__)
print(C.__mro__)
'''
(<class '__main__.A'>, <class 'object'>)
(<class '__main__.B'>, <class 'object'>)
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class 'object'>)
'''
object.__subclasses__()
A.__subclasses__()
C.__subclasses__()
'''
[<class 'type'>, <class 'async_generator'>, <class 'bytearray_iterator'>, <class 'bytearray'>, <class 'bytes_iterator'>, <class 'bytes'>, <class 'builtin_function_or_method'>, <class 'callable_iterator'>, <class 'PyCapsule'>, <class 'cell'>, <class 'classmethod_descriptor'>, <class 'classmethod'>, <class 'code'>, <class 'complex'>, <class '_contextvars.Token'>, <class '_contextvars.ContextVar'>, <class '_contextvars.Context'>, <class 'coroutine'>, <class 'dict_items'>, <class 'dict_itemiterator'>, <class 'dict_keyiterator'>, <class 'dict_valueiterator'>, <class 'dict_keys'>, <class 'mappingproxy'>, <class 'dict_reverseitemiterator'>, <class 'dict_reversekeyiterator'>, <class 'dict_reversevalueiterator'>, <class 'dict_values'>, <class 'dict'>, <class 'ellipsis'>, <class 'enumerate'>, <class 'filter'>, <class 'float'>, <class 'frame'>, <class 'frozenset'>, <class 'function'>, <class 'generator'>, <class 'getset_descriptor'>, <class 'PyHKEY'>, <class 'instancemethod'>, <class 'list_iterator'>, <class 'list_reverseiterator'>, <class 'list'>, <class 'longrange_iterator'>, <class 'int'>, <class 'map'>, <class 'member_descriptor'>, <class 'memoryview'>, <class 'method_descriptor'>, <class 'method'>, <class 'moduledef'>, <class 'module'>, <class 'odict_iterator'>, <class 'pickle.PickleBuffer'>, <class 'property'>, <class 'range_iterator'>, <class 'range'>, <class 'reversed'>, <class 'symtable entry'>, <class 'iterator'>, <class 'set_iterator'>, <class 'set'>, <class 'slice'>, <class 'staticmethod'>, <class 'stderrprinter'>, <class 'super'>, <class 'traceback'>, <class 'tuple_iterator'>, <class 'tuple'>, <class 'str_iterator'>, <class 'str'>, <class 'wrapper_descriptor'>, <class 'zip'>, <class 'types.GenericAlias'>, <class 'anext_awaitable'>, <class 'async_generator_asend'>, <class 'async_generator_athrow'>, <class 'async_generator_wrapped_value'>, <class 'Token.MISSING'>, <class 'coroutine_wrapper'>, <class 'generic_alias_iterator'>, <class 'items'>, <class 'keys'>, <class 'values'>, <class 'hamt_array_node'>, <class 'hamt_bitmap_node'>, <class 'hamt_collision_node'>, <class 'hamt'>, <class 'InterpreterID'>, <class 'managedbuffer'>, <class 'memory_iterator'>, <class 'method-wrapper'>, <class 'types.SimpleNamespace'>, <class 'NoneType'>, <class 'NotImplementedType'>, <class 'str_ascii_iterator'>, <class 'types.UnionType'>, <class 'weakref.CallableProxyType'>, <class 'weakref.ProxyType'>, <class 'weakref.ReferenceType'>, <class 'EncodingMap'>, <class 'fieldnameiterator'>, <class 'formatteriterator'>, <class 'BaseException'>, <class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib.BuiltinImporter'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib._ImportLockContext'>, <class '_thread.lock'>, <class '_thread.RLock'>, <class '_thread._localdummy'>, <class '_thread._local'>, <class '_io._IOBase'>, <class '_io.IncrementalNewlineDecoder'>, <class '_io._BytesIOBuffer'>, <class 'nt.ScandirIterator'>, <class 'nt.DirEntry'>, <class '_frozen_importlib_external.WindowsRegistryFinder'>, <class '_frozen_importlib_external._LoaderBasics'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external.NamespaceLoader'>, <class '_frozen_importlib_external.PathFinder'>, <class '_frozen_importlib_external.FileFinder'>, <class 'codecs.Codec'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class '_abc._abc_data'>, <class 'abc.ABC'>, <class 'collections.abc.Hashable'>, <class 'collections.abc.Awaitable'>, <class 'collections.abc.AsyncIterable'>, <class 'collections.abc.Iterable'>, <class 'collections.abc.Sized'>, <class 'collections.abc.Container'>, <class 'collections.abc.Callable'>, <class '_winapi.Overlapped'>, <class 'os._wrap_close'>, <class 'os._AddedDllDirectory'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class '_sitebuiltins._Helper'>, <class '_multibytecodec.MultibyteCodec'>, <class '_multibytecodec.MultibyteIncrementalEncoder'>, <class '_multibytecodec.MultibyteIncrementalDecoder'>, <class '_multibytecodec.MultibyteStreamReader'>, <class '_multibytecodec.MultibyteStreamWriter'>, <class '_virtualenv._Finder'>, <class '_distutils_hack._TrivialRe'>, <class '_distutils_hack.DistutilsMetaFinder'>, <class '_distutils_hack.shim'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>]
[<class '__main__.C'>]
[]
'''

七、类的拷贝

变量的赋值:A=B,该变量A的指针直接指向B指向的内存空间

浅拷贝:A=copy.copy(B),给A开辟一个新的空间,A指向该空间,该空间中的内容完全拷贝了B指向的空间的内容。

深拷贝:A=copy.deepcopy(B),给A给A开辟一个新的空间,A指向该空间,该空间中的对象同样开辟新的空间。

都不调用__init__()

红色com1是赋值

蓝色com2是浅拷贝

橙色com3是深拷贝

一、变量的赋值

普通的不可变数据类型的赋值,只会有一个对象,所有变量指向同一个变量。

可变组合数据类型会创建一个副本,赋值之后产生一个新的对象,该对象指向新对象。

通过以下例子你会发现,com和com1指向的地址是一样的,给com1.a赋值之后,com.a的值也发生了变化,说明com和com1真的指向的是同一个内存地址,本质上属于同一个变量。

class A:
    pass
class B:
    pass
class Computer:
    def __init__(self,a,b):
        self.a=a
        self.b=b

a=A()
b=B()
a1=A()

com=Computer(a,b)
com1=com
print(com,com.a,com.b)
print(com1,com1.a,com1.b)
com1.a=a1
print(com1,com1.a,com1.b)
print(com,com.a,com.b)
'''
<__main__.Computer object at 0x0000020FB8E48D50> <__main__.A object at 0x0000020FB8E48C90> <__main__.B object at 0x0000020FB8E48CD0>
<__main__.Computer object at 0x0000020FB8E48D50> <__main__.A object at 0x0000020FB8E48C90> <__main__.B object at 0x0000020FB8E48CD0>
<__main__.Computer object at 0x0000020FB8E48D50> <__main__.A object at 0x0000020FB8E48D10> <__main__.B object at 0x0000020FB8E48CD0>
<__main__.Computer object at 0x0000020FB8E48D50> <__main__.A object at 0x0000020FB8E48D10> <__main__.B object at 0x0000020FB8E48CD0>
'''

lst1=[1,2,3]
lst2=[1,2,3]
print(id(lst1),id(lst2))
lst2.append(4)
print(id(lst2))
'''
1377912245248 1377913237952
1377913237952
'''

t1=tuple([1,2,3])
t2=t1
print(id(t1),id(t2))

二、浅拷贝

使用copy模块,子对象类型不拷贝。也就是说这个时候两个变量指向的是两个不同的对象,但是原来的对象中的对象仍然指向同一个对象。

import copy
class A:
    pass
class B:
    pass
class Computer:
    def __init__(self,a,b):
        self.a=a
        self.b=b
a=A()
b=B()

com=Computer(a,b)
com1=copy.copy(com)
print(com,com.a,com.b)
print(com1,com1.a,com1.b)
'''
<__main__.Computer object at 0x0000019D2E6793D0> <__main__.A object at 0x0000019D2E679210> <__main__.B object at 0x0000019D2E678A50>
<__main__.Computer object at 0x0000019D2E67A7D0> <__main__.A object at 0x0000019D2E679210> <__main__.B object at 0x0000019D2E678A50>
'''

com和com1指向了内存中不同的对象,内存地址不同,但是他们中的对象仍然指向的是同一个对象。相当于给com1开辟了一个新的空间,里面的内容仍然完全copy了com的内容。

三、深拷贝

import copy
class A:
    pass
class B:
    pass
class Computer:
    def __init__(self,a,b):
        self.a=a
        self.b=b
a=A()
b=B()

com=Computer(a,b)
com1=copy.deepcopy(com)
print(com,com.a,com.b)
print(com1,com1.a,com1.b)
'''
<__main__.Computer object at 0x0000028D1A3B93D0> <__main__.A object at 0x0000028D1A3B9210> <__main__.B object at 0x0000028D1A3B8A90>
<__main__.Computer object at 0x0000028D1A3BBC10> <__main__.A object at 0x0000028D1A3D3FD0> <__main__.B object at 0x0000028D1A3D3E50>

'''

八、总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/339933.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐IDEA一个小插件,实用性很高!!

插件&#xff1a; Convert YAML and Properties File 由于每个人的开发习惯不同&#xff0c;在开发过程中会遇到各种小细节的问题。今天给大家介绍一个小插件&#xff0c;作用不大&#xff0c;细节很足。 就是properties类型文件和yml文件互相自由转换 解决&#xff1a;…

2023年DevOps国际峰会暨 BizDevOps 企业峰会(DOIS北京站):核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展&#xff0c;软件开发的模式和流程也在不断地演变。在众多软件开发方法中&#xff0c;DevOps已成为当下热门的软件开发运维一体化模式。特别是在中国&#xff0c;随着越来越多的企业开始认识到DevOps的价值&#xff0c;这一领域的研究与实践活动日益活跃。本…

计算机网络——运输层(2)暨小程送书

计算机网络——运输层&#xff08;2&#xff09;暨小程送书 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 运输层&#xff08;2&#xff09;TCP/IP对比TCP&#xff08;传输控制协议&#xff09;&#xff1a;IP&#xff08;互联网协议&#xff09;&#xff1a;总结 拥塞…

【设计模式】适配器和桥接器模式有什么区别?

今天我探讨一下适配器模式和桥接模式&#xff0c;这两种模式往往容易被混淆&#xff0c;我们希望通过比较他们的区别和联系&#xff0c;能够让大家有更清晰的认识。 适配器模式&#xff1a;连接不兼容接口 当你有一个类的接口不兼容你的系统&#xff0c;而你又不希望修改这个…

RabbitMQ的安装使用

RabbitMQ是什么&#xff1f; MQ全称为Message Queue&#xff0c;消息队列&#xff0c;在程序之间发送消息来通信&#xff0c;而不是通过彼此调用通信。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时&#xff0c;消费者无法快速消费&#xff0c;…

公网环境调试本地配置的Java支付宝沙箱环境模拟支付场景

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

【Proteus仿真】【51单片机】遥控小风扇设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用数码管显示模块、L298N电机驱动模块、按键、直流电机风扇、红外遥控等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示风扇速度档位&a…

【操作系统】实验二 Proc文件系统

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

FluoroQuest抗淬灭试剂盒I 适合载玻片成像,能够提高荧光信号的强度和稳定性

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;FluoroQuestAnti-fading Kit I Optimized for Slide Imaging&#xff0c;FluoroQuest抗淬灭试剂盒I 适合载玻片成像 一、基本信息 产品简介&#xff1a;FluoroQuest抗淬灭试剂盒I 适合载玻片成像能够抑制淬灭效应&a…

unity项目《样板间展示》开发:素材导入与整理

第一章&#xff1a;素材导入与整理 前言一、创建项目文件二、导入素材模型三、素材模型整理四、光源模型管理结语 前言 这次带大家从0到1做一个unity项目&#xff1a;《样板间展示》。 顾名思义&#xff0c;项目内容是展示样板间&#xff0c;即玩家可以与房间中的物体、家具进行…

二维码地址门牌管理系统:智慧城市新篇章

文章目录 前言一、轮播广告位&#xff1a;全面信息传达二、智能化管理&#xff1a;应对挑战三、安全保障&#xff1a;市民隐私优先四、广泛应用&#xff1a;助力城市建设 前言 随着科技的飞速发展&#xff0c;城市的智能化已成不可逆转的趋势。二维码地址门牌管理系统作为新一…

ITSS认证有用吗❓属于gj级证书吗❓

&#x1f525;ITSS由中国电子技术标准化研究院推出&#xff0c;包括“IT 服务工程师”和“IT 服务经理”两种认证。该系列认证符合GB/T 28827.1 的评估和ITSS服务资质升级要求。 &#x1f3af;ITSS是受到gj认可的&#xff0c;在全国范围内对IT服务管理人员从业资格为一的权威的…

linux杀毒软件clamav安装使用

1、下载 在下面地址下载&#xff1a;https://www.clamav.net/downloads 2、安装 clamav-1.2.1.linux.x86_64.rpm放在/home路径。 执行&#xff1a; chmod -R 777 /home/clamav-1.2.1.linux.x86_64.rpm rpm -ivh clamav-1.2.1.linux.x86_64.rpm3、下载病毒库 下载路径&am…

解决element-ui中的el-select选择器无法显示选中内容的问题

问题描述&#xff1a; 排查方法&#xff1a; 检查数据控制台是否报错&#xff0c;无报错 检查change是否触发&#xff0c;会触发 最后开始百度&#xff0c;查看文档 官方文档有这么一段话&#xff0c;就是属性一定要挂载到data上&#xff0c;不然无法检测。 最后解决&#…

K8S的helm

helm的作用 在没有helm之前&#xff0c;deploymen service ingress &#xff0c;helm的作用就是通过打包的方式&#xff0c;把deployment&#xff0c;service&#xff0c;ingress 这些打包在一块&#xff0c;一键式的部署服务&#xff0c;类似yum 官方提供的一个类似于安装仓库…

python|写一个简单的web应用框架

写应用框架需要写底层服务器么? 这个要区分2种情况&#xff0c;如果应用框架&#xff0c;你没有参考WSGI标准&#xff0c;那么在写应用框架之前&#xff0c;你就必须要定义一套属于自己的服务器&#xff0c;当然本文不采取这种方式&#xff0c;专业的事情应该专业的人来做。我…

JavaEE 文件操作IO

文件操作&IO 文章目录 文件操作&IO1. 认识文件2. 文件操作2.1 File 类2.2 文件读写2.2.1 FileInputStream2.2.2 FileOutputStream2.2.3 FileReader2.2.4 FileWriter2.2.5 Scanner读取文件 3. 案例练习3.1 案例一3.2 案例二3.3 案例三 在进行文件操作之前&#xff0c;我…

Oladance、韶音、南卡开放式耳机究竟哪款更胜一筹?揭秘超强机型对比!

​探寻音乐的美妙&#xff0c;我来亲测市面上热门三大品牌Oladance、韶音、南卡的开放式耳机&#xff01;深度评测音质&#xff0c;真实还原音乐细腻之处。从我自己测评过的开放式耳机中挑选&#xff0c;告别劣质产品带来的音乐质量风险。严选精品&#xff0c;守护你的听觉健康…

CERT_HAS_EXPIRED

npm 安装报错&#xff0c;提示证书过期&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://r.cnpmjs.org/md5 failed, reason: certificate has expired npm ERR! A complete log of this run can be found in: npm…

【openGauss/MogDB使用mog_xlogdump解析 xlog文件内容】

openGauss/MogDB的mog_xlogdump工具类似于PostgreSQL的pg_xlogdump/pg_waldump&#xff0c;可以解析xlog日志&#xff0c;获取xlog里的相关记录。可以通过MogDB的官网下载对应的版本使用&#xff0c; https://www.mogdb.io/downloads/mogdb 一、 创建表并增加主键&#xff08;…