Python面向对象丨面向过程和面向对象,你真的了解“对象”吗?

news2024/11/18 11:18:14

Author:AXYZdong 硕士在读 工科男
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@AXYZdong,CSDN首发,AXYZdong原创
唯一博客更新的地址为: 👉 AXYZdong的博客 👈
B站主页为:AXYZdong的个人主页

文章目录

  • 前言
  • 0. 什么是对象(object)?
  • 1. 面向过程和面向对象
  • 2. 类(class)
  • 3. 属性(attribute)
    • 3.1 属性和变量的区别
    • 3.2 对象属性
    • 3.3 类属性
    • 3.4 对象属性和类属性对比
    • 3.5 限制对象属性的添加
  • 4. 方法
    • 4.1 什么是方法?
    • 4.2 实例方法
    • 4.3 类方法
    • 4.4 静态方法
    • 4.5 不同类型的方法访问不同类型的属性
  • 总结
  • 参考文献

前言

本文为面向对象在Python中的实践,所使用的 环境为Python3.7

参考视频:https://www.bilibili.com/video/BV1A4411v7b2

本文主要是对视频内容的整理与自我总结和体会。

0. 什么是对象(object)?

“把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。”

——比较正式的说法

更通俗易懂的说法,下面这段内容来自于知乎。

一句话说明什么是面向对象?你个土鳖,你们全家都是土鳖!

好像有人说过这样的话,当头棒喝的方式虽然情感上不易接受,但记忆效果十分显著。

好吧,如果你觉得“土鳖”实在难听也不能准确定位你的档次,你可以自行将其替换为“土豪”,whatever。

面向对象思想有三大要素:封装、继承和多态。

  • 封装:不管你是土鳖还是土豪,不管你中午吃的是窝头还是鲍鱼,你的下水都在你肚皮里,别人看不到你中午吃了啥,除非你自己说给他们听(或者画给他们看,whatever);
  • 继承:刚说了,你个土鳖/豪,你们全家都是土鳖/豪。冰冻三尺非一日之寒,你有今天,必定可以从你爸爸爷爷那里追根溯源。正所谓虎父无犬子,正恩同学那么狠,他爹正日就不是什么善茬,更甭说他爷爷日成,明白了吗?
  • 多态:哲学家说过,世上不会有两个一模一样的双胞胎。即使你从你父亲那里继承来的土鳖/豪气质,也不可能完全是从一个模子里刻出来的,总会有些差别。比如你爸喜欢蹲在门前吃面,你喜欢骑在村口的歪脖子树上吃,或者反过来。当然,也可能令尊爱吃龙虾鲍鱼时旁边有几个艺校小女生喝酒唱歌助兴,你可能更喜欢弄个街舞乐队来吹拉弹唱。

作者:成心文
链接:https://www.zhihu.com/question/19854505/answer/21143952
来源:知乎

万物皆对象,对象是具体的事物。

  • 具有属性
  • 具有行为(方法)
  • 把很多零散的东西,封装成一个整体

也就是说一个对象具有静态特征(属性)和动态特征(行为)。

举例:

比如有个叫王二小的人,他有属性和行为。

他的属性

  • 姓名
  • 年龄
  • 身高
  • 体重

他的行为

  • 走路
  • 吃饭
  • 放羊

Python中的体现

Python 是一门彻底的面向对象编程的语言(OOP:Object Oriented Programming)

在其他的语言中一般都包括基本数据类型和对象类型,而在Python中将它们统称为对象类型,包括 int、float、bool、list、dictionary…

1. 面向过程和面向对象

总的来说都是一种解决问题的思路,面向对象本身则是对面向过程的封装。

  • 面向过程:在解决问题的时候,关注的是解决问题的每一个的过程(步骤)。
  • 面向对象:在解决问题的时候,关注的是解决问题所需要的对象。

面向过程编程关键在于按照步骤划分,把一个任务分解成具体的每一个步骤。而面向对象编程的关键是按照功能将对象进行划分,找到对象,确定对象属性和行为。

从面向过程过度到面向对象

  1. 列举出一个任务的具体实现步骤
  2. 试图分离这些实现步骤中的功能代码块
  3. 将这些功能代码块,划分到某一个对象中
  4. 根据这个对象以及对应的行为,抽象出对应的类

2. 类(class)

简单的说,类是对象的蓝图和模板,而对象是类的实例。

这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的东西。在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。

当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个叫做“类”的东西。也就是某个具体对象特征的抽象

类由名称、属性和方法组成,属性和方法是抽象的概念,而根据抽象的类可以产生具体的对象。这些对象才拥有具体的属性和方法。

生活中的类:

  1. 类:汽车。对象:大众、奥迪、马自达…
  2. 类:手机。对象:华为手机、小米手机…
  3. 类:熊类。对象:熊大、熊二…

类和对象的关系

  • 对象的 抽象化 形成类
  • 类的 实例化 形成对象

▲ 类和对象关系

类的定义

>>>class People:
       pass
>>>print(People)
<class '__main__.Name'>
  • 类名的首字母需要大写

根据类创建(实例化)对象

>>>class People:
       pass
>>>print(People)
<class '__main__.Name'>
>>>one = People()
>>>print(one)
<__main__.Name object at 0x000001790BF5B8E0>

从打印出来的结果可以看到 Name 是一个类,而 one 是一个对象。

在这里插入图片描述

▲ 实例化过程的底层内存图

3. 属性(attribute)

3.1 属性和变量的区别

1、概念

  • 变量是“可以改变的量”
  • 属性是“属于某个对象的特性”

2、访问权限

  • 变量,根据不同的位置,存在不同的访问权限。全局变量、局部变量…
  • 属性,只能通过对象来访问,因此必须先找到对象。对象也是通过变量名来引用,而既然是对象也有对应的访问权限。

判定依据

变量是否有宿主

  • 有,则就是属性。而这个宿主就是对象。
  • 否,则就是变量。

可以根据属性宿主的不同,将属性分为对象属性类属性。如果属性的宿主为对象,则为对象属性。否则,是类属性。

3.2 对象属性

>>> class Person:
	pass

>>> p = Person()
>>> p.age = 18		#增加age属性
>>> print(p.age)
18
>>> print(p.__dict__)
{'age': 18}
>>> p.hight = 180		#增加hight属性
>>> print(p.hight)
180
>>> print(p.__dict__)
{'age': 18, 'hight': 180}
>>> class Person:
	pass

>>> p = Person()
>>> p.age = 18
>>> print(p.age)
18
>>> p.age = 20
>>> print(p.age)
20
>>> print(p.sex)		#对象里面没有定义相关属性在查询时会报错
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    print(p.sex)
AttributeError: 'Person' object has no attribute 'sex'

对象.属性,和增加对象属性类似,如果当前属性存在就是修改对象属性,如果当前属性不存在就是增加对象属性。

>>> class Person:
	pass

>>> p = Person()
>>> p.num = [1,2,3]
>>> print(p.num,id(p.num))
[1, 2, 3] 1959642842376
>>> p.num = ['a','b','c']
>>> print(p.num,id(p.num))
['a', 'b', 'c'] 1959642842888
>>> p.num.append('d')		#利用append方法则不会重新开辟空间
>>> print(p.num,id(p.num))
['a', 'b', 'c', 'd'] 1959642842888

修改对象属性,重新开辟一个空间,相当于修改了对应标签的地址。

del 对象.属性

>>> class Person:
	pass

>>> p = Person()
>>> p.age = 18
>>> print(p.age)
18
>>> del p.age
>>> print(p.age)
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    print(p.age)
AttributeError: 'Person' object has no attribute 'age'
  • 注意事项

利用对象.__dict__ 查看对象的所有属性。

不同的对象之前不能互相访问对方的属性,否则会报错。

>>> class Person:
	pass

>>> p = Person()
>>> p1 = Person()
>>> p2 = Person()
>>> p1.age = 18
>>> p2.address = 'shanghai'
>>> print(p1.address)
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    print(p1.address)
AttributeError: 'Person' object has no attribute 'address'
>>> p1.hight = 180
>>> print(p1.__dict__)
{'age': 18, 'hight': 180}

3.3 类属性

万物皆对相关,类也是一个"对象"。

方式一:类名.类属性 = 值

>>> class Money:
	pass

>>> Money.count = 0
>>> print(Money.count)
0
>>> print(Money.__dict__)	#利用 `Money.__dict__` 查看类的所有属性。
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None, 'count': 0}

方式二:直接在类定义里面添加

>>> class Money:
	count = 18
	num = 100
	age = 20
	
>>> print(Money.count,Money.num,Money.age)
18 100 20
>>> print(Money.__dict__)	#利用 `Money.__dict__` 查看类的所有属性。
{'__module__': '__main__', 'count': 18, 'num': 100, 'age': 20, '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None}

通过类访问:类名.类属性

通过对象访问:对象.类属性

>>> class Money:
	count = 18
	num = 100
	age = 20

	
>>> one = Money()
>>> print(one.age ,one.count ,one.num )
20 18 100

在这里插入图片描述

▲ 类属性创建内存图

可以通过对象访问到类属性,和Python对象的属性查找机制有关。优先到对象自身查找属性,找到则结束。否则,根据__class__找到对象对应的类,再到这个类里面查找。

>>> class Money:
	count = 18
	num = 100
	age = 20

	
>>> one = Money()
>>> print(one.age ,one.count ,one.num )
20 18 100
>>> print(one.__class__)
<class '__main__.Money'>
>>> class Test:
	hight = 178

	
>>> one.__class__ = Test
>>> print(one.hight)
178

通过类名改,语法和给类名增加一个属性的方式相似。如果属性不存在,则新增;如果存在,则修改。

类名.属性 = 值

>>> class Money:
	count = 18
	num = 100
	age = 20

	
>>> Money.age = 22
>>> print(Money.age)
22

不能通过对象修改类属性。

del 类名.属性

>>> class Money:
	count = 18
	num = 100
	age = 20

	
>>> del Money.age
>>> print(Money.age)
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    print(Money.age)
AttributeError: type object 'Money' has no attribute 'age'
>>> one = Money()
>>> del one.age
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    del one.age
AttributeError: age
>>> Money.age = 20
>>> one.age = 18
>>> del one.age
>>> print(one.age)	#通过对象对应的类访问属性
20

不能通过对象删除类属性。

类属性的内存存储

一般情况下,属性存储在__dict__的字典当中,可以通过 对象.__dict__ 来查看所有的属性。

>>> class Money:
	pass

>>> one = Money()
>>> one.age = 22
>>> one.hight = 180
>>> print(one.__dict__)
{'age': 22, 'hight': 180}

可以通过增加/修改__dict__的字典当中的内容,从而控制实例对象的属性

>>> class Money:
	pass

>>> one = Money()
>>> one.age = 22
>>> one.hight = 180
>>> print(one.__dict__)
{'age': 22, 'hight': 180}
>>> one.__dict__ = {'name': 'axyzdong', 'age': 22, 'hight': 180}
>>> print(one.__dict__)
{'name': 'axyzdong', 'age': 22, 'hight': 180}
>>> one.__dict__['hight'] = 190
>>> print(one.__dict__)
{'name': 'axyzdong', 'age': 22, 'hight': 190}

无法通过直接修改__dict__中的内容来改变类的属性

>>> class Money:
	count = 18
	num = 100
	age = 20

	
>>> print(Money.__dict__)
{'__module__': '__main__', 'count': 18, 'num': 100, 'age': 20, '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None}
>>> Money.__dict__ = {'name': 'axyzdong', 'age': 22, 'hight': 180}		#直接修改会报错
Traceback (most recent call last):
  File "<pyshell#53>", line 1, in <module>
    Money.__dict__ = {'name': 'axyzdong', 'age': 22, 'hight': 180}
AttributeError: attribute '__dict__' of 'type' objects is not writable
>>> Money.__dict__['age'] = 20
Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    Money.__dict__['age'] = 20
TypeError: 'mappingproxy' object does not support item assignment

可以使用 setattr 方法进行修改。

类属性被各个对象所共享

类属性修改之后,所有的对象访问到的类属性都会跟着修改.

>>> class Money:
	age = 18

	
>>> one = Money()
>>> two = Money()
>>> print(one.age,two.age)
18 18
>>> Money.age = 20
>>> print(one.age,two.age)
20 20

3.4 对象属性和类属性对比

存储不同、抽象层级不同、宿主不同。

增删改查中“增删改”的语法基本相同,在“查”中,实例对象中如果没有该属性,则会到实例对象所对应的类中寻找类属性。

>>> class Person:
	age = 18

	
>>> p = Person()
>>> p.age += 5	#先访问类对象中的属性,然后再创建实例对象的属性
>>> print(Person.age)
18
>>> print(p.age)
23

3.5 限制对象属性的添加

>>> class Person:
   __slots__ = ['age']		
   pass

>>> p1 = Person()
>>> p1.age = 18
>>> print(p1.age)
18
>>> p1.num = 100
Traceback (most recent call last):
 File "<pyshell#78>", line 1, in <module>
   p1.num = 100
AttributeError: 'Person' object has no attribute 'num'
>>> p2 = Person()
>>> p2.age = 28
>>> print(p2.age)
28
>>> p2.hight = 180
Traceback (most recent call last):
 File "<pyshell#82>", line 1, in <module>
   p2.hight = 180
AttributeError: 'Person' object has no attribute 'hight'

__slots__ = ['age'] 限制对象的属性只能有 age ,如果添加其他属性则会报错。其中列表中的元素,即为通过这个类创建出的对象可以添加的对象属性,如果这个类实例出的对象,添加了非列表之内的属性,则会报错。

4. 方法

4.1 什么是方法?

描述一个目标行为动作,和函数非常类似

  • 都封装了一系列动作
  • 都可以被调用之后,执行一系列动作
  • 主要区别是调用方式的不同
>>> class Person:
	def eat(self):
		print(1)
		print(2)
		print(3)

		
>>> p1 = Person()
>>> p1.eat()
1
2
3

关于self

self表示当前对象

  1. self并不是一个关键字,其实可以是任意的标识符,为了表达代表的是当前对象自己,习惯用self
  2. 调用实例函数的时候,self不需要手动传参,系统会自动传递当前的对象
  3. 哪个对象调用了方法,方法里的self指的就是谁。
    通过 self.属性名 可以访问到这个对象的属性。
    通过 self.方法名() 可以调用这个对象的方法。

方法的划分

  • 实例方法:默认第一个参数需要接收到一个实例
  • 类方法:默认第一个参数需要接收到一个类
  • 静态方法:第一个参数不需要默认接收
  1. 划分依据:方法的第一个参数必须要接收的数据类型;
  2. 不管是哪一种类型的方法,都是存储在类当中,不会是在实例当中;
  3. 不同类型方法的调动方法不同,但是最终要保证不同类型的方法第一个参数接收到的数据是他们想要的类型。
>>> class Person:
	def func(self):
		print('实例方法',self)
	@classmethod	
	def classfunc(cls):
		print('类方法',cls)
	@staticmethod	
	def staticfunc():
		print('静态方法')

		
>>> p = Person()
>>> p.func()
实例方法 <__main__.Person object at 0x000002413B224548>
>>> Person.classfunc()
类方法 <class '__main__.Person'>
>>> Person.staticfunc()
静态方法

方法的存储

不论是哪一种类型的方法都存储在类当中。

>>> class Person:
	def func(self):
		print('实例方法',self)
	@classmethod	
	def classfunc(cls):
		print('类方法',cls)
	@staticmethod	
	def staticfunc():
		print('静态方法')

		
>>> p = Person()
>>> p.func()
实例方法 <__main__.Person object at 0x000002413B224548>
>>> Person.classfunc()
类方法 <class '__main__.Person'>
>>> Person.staticfunc()
静态方法
>>> print(p.__dict__)	#并不会存储在实例对象中
{}
>>> print(Person.__dict__)
{'__module__': '__main__', 'func': <function Person.func at 0x000002413B27F0D8>, 'classfunc': <classmethod object at 0x000002413B25B808>, 'staticfunc': <staticmethod object at 0x000002413B119288>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}

Person.__dict__ 中就包含了前面定义的 funcclassfuncstaticfunc 三种不同类型的方法。而这些方法是不会存储在实例对象中的。

4.2 实例方法

  • 按照 实例化对象.方法 的模式调用,必须传递一个对象,在调用方法之前,定义一个实例化对象.对象本身参数不需传。

  • 也可以使用 类.方法 调用,这种方式相当于函数,每个参数都要传进去。

>>> class Person:
	def eat(self,food):
		print('在吃',self,food)

		
>>> p = Person()
>>> p.eat('apple')	# 实例化对象.方法,不需要传self参数
在吃 <__main__.Person object at 0x000002413B0855C8> apple
>>> print(Person.eat)
<function Person.eat at 0x000002413B27F5E8>
>>> Person.eat('123','apple')	# 类.方法,每个参数都要传,相当于一个函数
在吃 123 apple

4.3 类方法

官方描述

"""
    classmethod(function) -> method
    
    Convert a function to be a class method.
    
    A class method receives the class as implicit first argument,
    just like an instance method receives the instance.
    To declare a class method, use this idiom:
    
      class C:
          @classmethod
          def f(cls, arg1, arg2, ...):
              ...
    
    It can be called either on the class (e.g. C.f()) or on an instance
    (e.g. C().f()).  The instance is ignored except for its class.
    If a class method is called for a derived class, the derived class
    object is passed as the implied first argument.
    
    Class methods are different than C++ or Java static methods.
    If you want those, see the staticmethod builtin.
    """

两种调用方式

  • 类调用:不用手动传递第一个参数,会自动的把调用的类本身给传递过去
  • 对象调用:不用手动传递第一个参数,会自动的把调用的对象所对应的类给传递过去
>>> class Person:
	@classmethod	
	def classfunc(cls,a):
		print('类方法',cls,a)

		
>>> Person.classfunc(111)
类方法 <class '__main__.Person'> 111
>>> p = Person()
>>> p.classfunc(123)
类方法 <class '__main__.Person'> 123

4.4 静态方法

  • 类调用:直接调用就可以, 不需要考虑第一个参数
  • 对象调用:直接调用就可以
>>> class Person:
	@staticmethod
	def staticfunc():
		print('静态方法')

		
>>> Person.staticfunc()
静态方法
>>> p = Person()
>>> p.staticfunc()
静态方法

4.5 不同类型的方法访问不同类型的属性

>>> class Person:
	age = 18
	def func(self):		#可以访问类属性和实例属性
		print(self.age)
		print(self.num)
	@classmethod	
	def classfunc(cls):	#只能访问类属性
		print(cls.age)
	@staticmethod	
	def staticfunc():	#只能访问类属性
		print(Person.age)

		
>>> p = Person()
>>> p.num = 22
>>> p.func()
18
22
>>> Person.classfunc()
18
>>> Person.staticfunc()
18

总结

  1. 在计算机编程中,对象是指具有状态和行为的实体。它是面向对象编程(OOP)的核心概念之一。面向过程编程和面向对象编程是两种不同的编程范式。在面向过程编程中,程序的结构是以函数为中心的,而在面向对象编程中,程序的结构是以对象为中心的。

  2. 类是对象的模板或蓝图,它定义了对象的属性和方法。属性是对象的特征,它们描述了对象的状态。属性可以是对象属性或类属性。对象属性是每个对象独有的,而类属性是所有对象共享的。

  3. 对象属性和变量之间有一些区别。变量是程序中用来存储数据的容器,而对象属性是对象的一部分,用于描述对象的状态。对象属性可以通过点运算符来访问,而变量可以直接使用。

  4. 对象属性可以通过定义类的构造函数来初始化。构造函数是一个特殊的方法,用于创建和初始化对象。类属性是在类定义中直接声明的属性,它们是所有对象共享的。

  5. 对象属性和类属性之间有一些区别。对象属性是每个对象独有的,而类属性是所有对象共享的。当一个对象的属性发生改变时,它只会影响该对象本身,而不会影响其他对象。而当一个类的属性发生改变时,所有对象的该属性都会发生改变。

  6. 有时候,我们希望限制对象属性的添加,以防止随意添加新属性。在Python中,可以使用 __slots__ 属性来限制对象属性的添加。__slots__ 属性是一个特殊的属性,它定义了一个对象可以拥有的属性的列表。

  7. 方法是对象可以执行的操作。它们定义了对象的行为。方法可以是实例方法、类方法或静态方法。实例方法是对象的方法,它可以访问对象的属性。类方法是与类相关联的方法,它可以访问类属性。静态方法是与类和对象无关的方法,它不能访问类属性或对象属性。

  8. 不同类型的方法可以访问不同类型的属性。实例方法可以访问对象属性和类属性。类方法可以访问类属性,但不能访问对象属性。静态方法不能访问类属性或对象属性。

总结来说,对象是具有状态和行为的实体,面向过程编程和面向对象编程是两种不同的编程范式。类是对象的模板,它定义了对象的属性和方法。属性是对象的特征,它们可以是对象属性或类属性。方法是对象可以执行的操作,它们可以是实例方法、类方法或静态方法。不同类型的方法可以访问不同类型的属性。

参考文献

[1]https://www.bilibili.com/video/BV1A4411v7b2

[2]https://blog.csdn.net/mall_lucy/article/details/106756318

—— END ——


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留言。或者你有更好的想法,欢迎一起交流学习~~~

更多精彩内容请前往 AXYZdong的博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机练习(04)

eg1:使用定时器的方式实现单片机流水灯 #include <REGX52.H> #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int uchar temp,t0;// 初始化函数 void init(){temp 0xfe;//第一个发光二级管点亮P1 temp;// 初始化定时器TMOD 0x11;TH0…

网络协议--IP选路

9.1 引言 选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生&#xff0c;也可以由其他主机产生。在后一种情况下&#xff0c;主机必须配置成一个路由器&#xff0c;否则通过网络接口接收到的数据报&#xff0c;如果目的地址不…

游戏盾如何有效防护DDoS

从进入计算机时代以来&#xff0c;DDoS攻击一直是网络世界中的一大威胁&#xff0c;让无数服务陷入瘫痪。这种攻击的原理非常简单&#xff1a;攻击者使用大量的僵尸主机或蠕虫病毒&#xff0c;向目标服务器发送海量请求&#xff0c;迅速耗尽服务器的资源&#xff0c;使其无法继…

ATF安全漏洞挖掘之FUZZ测试

安全之安全(security)博客目录导读 ATF(TF-A)/OPTEE之FUZZ安全漏洞挖掘汇总 目录 一、tf-a-tests简介 二、TF-A SMC_FUZZING 一、tf-a-tests简介 tf-a-tests.git - Trusted Firmware-A Tests 版本下载 tf-a-tests.git - Trusted Firmware-A Tests 文档描述 Getting Star…

大二第三周总结(算法+生活)

算法&#xff1a; 题目&#xff1a;有效的括号 这个题目也是做过很多回了。主要就是数据结构中”栈“的应用&#xff0c;先进后出。 解题思路&#xff1a; 1.创建 Map 哈希表形成键值对映射 2.进行遍历字符串 在遍历过程中 如果 遍历到的字符c 是左括号&#xff0c;则入栈 pu…

【2024秋招】2023-8-5-小红书-数据引擎团队后端开发提前批面经

1 面试官介绍 OLAP引擎&#xff0c;离线引擎&#xff0c;大数据分析中间件 2 自我介绍 缺点&#xff1a; &#xff08;1&#xff09;面试官让重点介绍自己最在行的项目&#xff0c;我真的在自我介绍上扯了一些别的东西… &#xff08;2&#xff09;在面试的时候因为想看简…

学习笔记---0基础+干货满满的单链表专题~~

目录​​​​​​​ 1. 链表的概念及结构&#x1f451; 1.1 什么是链表&#xff1f;&#x1f440; 1.2 为什么需要链表&#xff1f;⁉️ 1.3 链表的结构是怎么样的&#xff1f;❓ 2. 链表的分类&#x1f99c; 3. 实现单链表&#x1faf5; 3.1 要实现的目标&#x1f3af;…

Ubuntu更新镜像源切换

概述 用ubuntu用apt命令&#xff0c;自动安装或更新包的时候&#xff0c;默认的镜像源服务器非常卡&#xff0c;很不方便。切换到国内的镜像源&#xff0c;下载更新非常快。为防止以后忘记&#xff0c;本文以国内服务器阿里巴巴的为例简单描述。 版本 Ubuntu23.10 找到更新…

使用 类加载器 或者 类对象 读取文件(参考的路径都是编译以后的文件夹,out 或者 target 文件夹 )

以下内容 本人都是 用 Maven 工程总结的 &#xff0c;所以会和普通项目的项目目录不太一样。相对路径&#xff1a;项目 的 根目录 开始查找。&#xff08; 但是在我们真正开发的时候&#xff0c;我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面&#xff0c;而是…

OpenAI 现已开始考虑自研 AI 芯片战略

根据 TechCrunch 的报道&#xff0c;随着 AI 芯片短缺的问题日益严重&#xff0c;OpenAI 现已开始考虑自研 AI 芯片。 据悉&#xff0c;从去年开始 OpenAI 内部就已经开始讨论 AI 芯片战略&#xff0c;以解决其 AI 芯片短缺的问题。这些方案包括自研 AI 芯片、与英伟达等芯片制…

用节点亲和性把 Pod 分配到节点

用节点亲和性把 Pod 分配到节点 当前集群信息&#xff1a; rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…

宝塔部署code-server

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 code-server其实就是vscode网页版&#xff0c;可以实现随时随地编程。那么本教程是将源码的二进…

理解电路:从电报机到门电路,我们如何做到“千里传信”?

目录 背景 从信使到电报&#xff0c;我们怎么做到“千里传书”&#xff1f; 理解继电器&#xff0c;给跑不动的信号续一秒 小结 背景 所有最终执行的程序其实都是使用“0”和“1”这样的二进制代码来表示的。我们知道&#xff0c;对应的整数和字符串&#xff0c;其实也是用…

2023 年和 2024 年 10 个最佳加密货币趋势

1.熊市低迷 加密货币市场已进入持续数月的长期看跌阶段。尽管 2023 年初出现了一些看涨走势&#xff0c;但大多数领先的加密货币随后都出现了看跌低迷&#xff0c;导致其市值大幅下跌。 此外&#xff0c;持续的熊市可归因于一系列因素&#xff0c;包括宏观经济不确定性、利率…

复杂系统设计基本注意事项

目录 一、软件复杂性度量方法 &#xff08;一&#xff09;McCabe度量方法 &#xff08;二&#xff09;John Ousterhout度量方法 &#xff08;三&#xff09;一般建议 二、复杂性带来的危害 &#xff08;一&#xff09;修改扩散&#xff08;Modification Diffusion&#x…

力扣每日一题54:螺旋矩阵

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#…

电路电子技术4 等效电阻的计算实际电源等效变换

1.等效电阻的计算 思路&#xff1a;清楚电路结构即可。可以看到&#xff08;R1//R2&#xff09;&#xff08;R3//R4&#xff09;。 这样即可得到答案C。 2.电流源等效电压源 实际电压源等效为实际电流源时&#xff0c;电流源的电激流应等于电压源的源电源除以电压源的内阻。 实…

django基于Python的房价预测系统+爬虫+大屏可视化分析

欢迎大家点赞、收藏、关注、评论 文章目录 前言一、项目介绍二、开发环境三、功能需求分析1 数据采集功能设计2数据管理功能设计3爬虫功能需求分析4 数据可视化功能需求分析数据库表的设计 四、核心代码五、效果图六、文章目录 前言 房价是一个国家经济水平的重要体现&#xff…

JS加密/解密之闭包的运用

深入探讨JavaScript闭包的演变与应用 摘要&#xff1a; 本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始&#xff0c;探讨它在JavaScript编程中的重要性&#xff0c;并通过实例展示闭包在不同场景下的灵活应用。 引言 JavaScrip…

2005.6-2018.6月中国企业OFDI微观数据

2005.6-2018.6月中国企业OFDI微观数据 1、时间&#xff1a;2005.6-2018.6 2、范围&#xff1a;公司 3、指标&#xff1a;Year、Month、Chinese Entity、 Quantity in Millions 、Share size、Transaction Party、Sector、Subsector、Country、Region、BRI 4、数据解释&…