python之面向对象编程
1、面向对象介绍:
世界万物,皆可分类
世界万物,皆为对象
只要是对象,就肯定属于某种类
只要是对象,就肯定有属性
2、 面向对象的几个特性:
class类:
一个类即对一类拥有相同属性的对象的抽象,蓝图、原型。在这个类中定义了这些对象都具备的属性,共同的方法。
object对象:
一个对象即是一个类的实例化,一个类必须经过实例化之后才能在程序中调用
三大特性:封装、继承和多态
封装:在类中对数据的赋值,内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
继承:一个类可以派生出子类,在这个父类里定义的属性,方法自动被子类继承
多态:
多态是面向对象的重要特性,简单说:一个接口,多种实现,只一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时对父类的方法做了不同的体现买这就是同一种事物表现出的多种形态
例子:老板说开始工作,不需要单独对公司的不同部门
如对商务部门说开始工作,对技术部门说开始工作…而是只需要说一句开始工作,这样各个部门就开始工作这就是一种多态的体现
多态允许将子类的对象当做父类的对象使用,某父类的引用指向其子类型的对象,调用的方法是该子类型的方法
3、面向对象编程OOP
无论是面向对象还是面向过程编程,或者其他方式编程,都要明确记住以下原则:
a. 写重复代码是非常不好的低级行为
b. 你写的代码需要经常变更
开发正规的程序跟那种写个运行一次就扔了的脚本有很大的不同,你的代码总是需要不断的更改,不是修改bug就是添加新功能等,所以为了日后方便程序的修改及扩展,你写的代码一定要遵循易读、易改的原则(可读性好、易扩展)
首先是一个简单的例子:用于理解面向对象
1 class Dog:
2 def bulk(self):
3 print("小A:wangwangwang....")
4 d1 = Dog()
5 d2 = Dog()
6 d3 = Dog()
7 d1.bulk()
8 d2.bulk()
9 d3.bulk()
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/dog.py 2 小A:wangwangwang.... 3 小A:wangwangwang.... 4 小A:wangwangwang....
从运行结果也发现三个小狗都在叫了,但是显示都是小A,如何让传入不同的值,体现让不懂的小狗在叫:
代码例子如下:
1 class Dog:2 def __init__(self,name):3 self.name = name4 5 def bulk(self):6 print("%s:wangwangwang...." %self.name)7 d1 = Dog("小A")8 d2 = Dog("小B")9 d3 = Dog("小C")
10 d1.bulk()
11 d2.bulk()
12 d3.bulk()
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/dog.py 2 小A:wangwangwang.... 3 小B:wangwangwang.... 4 小C:wangwangwang....
下面从经常玩的cs中人物角色中体现:
角色很简单,就俩个,恐怖份子、警察,他们除了角色不同,其它基本都 一样,每个人都有生命值、武器等。如果不用OPP面向对象编程,方法如下:
1 #role 12 name = 'Dean'3 role = 'terrorist'4 weapon = 'AK47'5 life_value = 1006 7 #rolw 28 name2 = 'Jack'9 role2 = 'police'
10 weapon2 = 'B22'
11 life_value2 = 100
上面定义了一个恐怖分子Dean和一个警察jack,但是只有2个人肯定不行,我们再建一个恐怖分子和警察
1 #role 12 name = 'Alex'3 role = 'terrorist'4 weapon = 'AK47'5 life_value = 1006 money = 100007 8 #rolw 29 name2 = 'Jack'
10 role2 = 'police'
11 weapon2 = 'B22'
12 life_value2 = 100
13 money2 = 10000
14
15 #role 3
16 name3 = 'Rain'
17 role3 = 'terrorist'
18 weapon3 = 'C33'
19 life_value3 = 100
20 money3 = 10000
21
22 #rolw 4
23 name4 = 'Eric'
24 role4 = 'police'
25 weapon4 = 'B51'
26 life_value4 = 100
27 money4 = 10000
4个角色虽然创建好了,但是有个问题就是,每创建一个角色,我都要单独命名,name1,name2,name3,name4…,后面的调用的时候这个变量名你还都得记着,要是再让多加几个角色,估计调用时就很容易弄混啦,所以我们想一想,能否所有的角色的变量名都是一样的,但调用的时候又能区分开分别是谁?
当然可以,我们只需要把上面的变量改成字典的格式就可以啦。
1 roles = {2 1:{'name':'Alex',3 'role':'terrorist',4 'weapon':'AK47',5 'life_value': 100,6 'money': 15000,7 },8 2:{'name':'Jack',9 'role':'police',
10 'weapon':'B22',
11 'life_value': 100,
12 'money': 15000,
13 },
14 3:{'name':'Rain',
15 'role':'terrorist',
16 'weapon':'C33',
17 'life_value': 100,
18 'money': 15000,
19 },
20 4:{'name':'Eirc',
21 'role':'police',
22 'weapon':'B51',
23 'life_value': 100,
24 'money': 15000,
25 },
26 }
27
28 print(roles[1]) #Alex
29 print(roles[2]) #Jack
很好,这个以后调用这些角色时只需要roles[1],roles[2]就可以啦,角色的基本属性设计完了后,我们接下来为每个角色开发以下几个功能
被打中后就会掉血的功能
开枪功能
换子弹
买枪
跑、走、跳、下蹲等动作
保护人质(仅适用于警察)
不能杀同伴
。。。
我们可以把每个功能写成一个函数,类似如下:
1 def shot(by_who):2 #开了枪后要减子弹数3 pass4 def got_shot(who):5 #中枪后要减血6 who[‘life_value’] -= 107 pass8 def buy_gun(who,gun_name):9 #检查钱够不够,买了枪后要扣钱
10 pass
11 ...
上述代码存在的问题:
- 每个角色定义的属性名称是一样的,但这种命名规则是我们自己约定的,从程序上来讲,并没有进行属性合法性检测,也就是说role 1定义的代表武器的属性是weapon, role 2 ,3,4也是一样的,不过如果我在新增一个角色时不小心把weapon 写成了wepon , 这个程序本身是检测 不到的
- terrorist 和police这2个角色有些功能是不同的,比如police是不能杀人质的,但是terrorist可能,随着这个游戏开发的更复杂,我们会发现这2个角色后续有更多的不同之处, 但现在的这种写法,我们是没办法 把这2个角色适用的功能区分开来的,也就是说,每个角色都可以直接调用任意功能,没有任何限制。
- 我们在上面定义了got_shot()后要减血,也就是说减血这个动作是应该通过被击中这个事件来引起的,我们调用get_shot(),got_shot()这个函数再调用每个角色里的life_value变量来减血。 但其实我不通过got_shot(),直接调用角色roles[role_id][‘life_value’] 减血也可以呀,但是如果这样调用的话,那可以就是简单粗暴啦,因为减血之前其它还应该判断此角色是否穿了防弹衣等,如果穿了的话,伤害值肯定要减少,got_shot()函数里就做了这样的检测,你这里直接绕过的话,程序就乱了。 因此这里应该设计 成除了通过got_shot(),其它的方式是没有办法给角色减血的,不过在上面的程序设计里,是没有办法实现的。
- 现在需要给所有角色添加一个可以穿防弹衣的功能,那很显然你得在每个角色里放一个属性来存储此角色是否穿 了防弹衣,那就要更改每个角色的代码,给添加一个新属性,这样太low了,不符合代码可复用的原则
如果将代码改为面型对象编程的方法:
1 class Role(object): #定义一个类,Role是类名,注意首字母大写,(object)是新式类的写法,必须这样写2 def __init__(self,name,role,weapon,life_value=100,money=15000):#这一部分是构造函数,#初始化函数,在生成一个角色时要初始化的一些属性需要填写在这里。实例变量(静态属性),作用域就是实例本身3 #下面是在实例化时做一些类的初始化工作4 self.name = name5 self.role = role6 self.weapon = weapon7 self.life_value = life_value8 self.money = money9
10 def shot(self): #类的方法,功能(动态属性)
11 print("shooting...")
12
13 def got_shot(self):
14 print("ah...,I got shot...")
15
16 def buy_gun(self,gun_name):
17 print("just bought %s" %gun_name)
18
19 r1 = Role('Alex','police','AK47’) #生成一个角色 实例化,也叫作初始化
20 r2 = Role('Jack','terrorist','B22’) #生成一个角色 实例化,也叫作初始化
从面向对象的代码可以看出比期初的代码少了一半
角色和它具备的功能可以一目了然
上面代码中__init__()叫做初始化(或构造方法),在类被调用时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,进行一些初始化的动作,所以上面写的__init__(self,name,role,weapon,life_value=100,money = 15000)就是在创建一个角色时候,给它设置这些属性
初始化一个角色,就需要调用这个类一次:
1 r1 = Role('Alex','police','AK47’) #生成一个角色 , 会自动把参数传给Role下面的__init__(...)方法 2 r2 = Role('Jack','terrorist','B22’) #生成一个角色
也就是创建角色时,并没有给__init__传值,程序也没有报错,这是因为类在调用他自己的__init__(…)时帮你给self参数赋值了,并且传参的时候其实r1也被传入的r1 = Role('Alex','police','AK47’)其实是r1 = Role(r1,'Alex','police','AK47’),所以在类中的self就相当于传入的r1
1 r1 = Role('Alex','police','AK47’) #此时self 相当于 r1 , Role(r1,'Alex','police','AK47’) 2 r2 = Role('Jack','terrorist','B22’)#此时self 相当于 r2, Role(r2,'Jack','terrorist','B22’)
当你执行r1 = Role('Alex','police','AK47’)时python解释器干了两件事:
- 在内存中开辟一块空间指向r1这个变量名
- 调用Role这个类并执行其中的__init__(…)方法,相当于Role.__init__(r1,'Alex','police',’AK47’),这么做是为什么呢? 是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,重要的事情说3次, 因为关联起来后,你就可以直接r1.name, r1.weapon 这样来调用啦。所以,为实现这种关联,在调用__init__方法时,就必须把r1这个变量也传进去,否则__init__不知道要把那3个参数跟谁关联呀。
- 所以这个__init__(…)方法里的,self.name = name , self.role = role 等等的意思就是要把这几个值 存到r1的内存空间里。
- 但是在实例化的时候类里面的方法并没有被拷贝一份到实例中,而是所有的实例都是调用类里面的方法,所以调用类中的方法是r1.buy_gun()相当于Role.buy_gun(r1)这也是为什么类里面的方法后面总是加了(self),这样从而区别出了不同的实例调用方法,下面是体现的代码例子:
1 def got_shot(self):2 print("%s ah...,I got shot..." %self.name)3 实例化的时候:4 r1 = Role('Alex', 'police', 'AK47') #生成一个角色 实例化,也叫作初始化5 r1.got_shot()6 运行结果:7 D:\python35\python.exe D:/python培训/s14/day6/cs.py8 Alex ah...,I got shot...9
10 Process finished with exit code 0
所以从这里也可以看出来r1.buy_gun()相当于Role.buy_gun(r1)
对上述的总结:
上面的这个r1 = Role('Alex','police','AK47’)动作,叫做类的“实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象了, 这个对象就叫做实例
刚才定义的这个类体现了面向对象的第一个基本特性,封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容
上面__init__代码中:
self.name = name 表示是实例变量
实例变量的作用域是实例本身
1 self.money = money #实例的变量(静态属性),作用域就是实例本身 2 def shot(self): #类的方法,功能(动态属性) 3 print("shooting...")
动态属性就是方法,静态属性就是变量
同样的也存在类变量
1 class Role(object): 2 n =123 #类变量,不用实例化也能打印出来
实例化之后打印:
1 r1 = Role('Alex', 'police', 'AK47') #生成一个角色 实例化,也叫作初始化
2 print(r1.n,r1.name)
3 运行结果:
4 D:\python35\python.exe D:/python培训/s14/day6/cs.py
5 123
6 123 Alex
7
8 Process finished with exit code 0
如果实例化之后对n进行更改,但是更改实例里面的n并不会影响类变量,因为在实例化的时候同样拷贝了一份到实例中。
1 r1 = Role('Alex', 'police', 'AK47') #生成一个角色 实例化,也叫作初始化2 r1.n = 4563 print(r1.n,r1.name)4 print(Role.n)5 运行结果如下:6 D:\python35\python.exe D:/python培训/s14/day6/cs.py7 1238 456 Alex9
10 Process finished with exit code 0
实例化找一个变量的时候会先从实例里面找,如果实例化里面没有这个变量,会再从全局变量里找
实例化之后添加属性:
1 r1 = Role('Alex', 'police', 'AK47') #生成一个角色 实例化,也叫作初始化
2 r1.bullet_prove = True
3 print(r1.name,r1.bullet_prove)
4 运行结果:
5 D:\python35\python.exe D:/python培训/s14/day6/cs.py
6 123
7 Alex True
8
9 Process finished with exit code 0
类变量的用途:大家公用的属性
4、 析构函数
在实例释放,销毁的时候执行的,通常用于一些收尾工作,如关闭数据库连接,打开的临时文件
代码例子在类中写入如下代码:
1 def __del__(self): 2 print("%s 彻底死了....." %self.name)
并且是做实例换不做任何其他操作,运行结果:
1 D:\python35\python.exe D:/python培训/s14/day6/cs.py 2 Alex 彻底死了..... 3 4 Process finished with exit code 0
但是同样执行了
当我实例化之后调用类中的方法的时候:
1 r1 = Role('Alex', 'police', 'AK47') #生成一个角色 实例化,也叫作初始化 2 3 r1.got_shot()
运行结果:
1 D:\python35\python.exe D:/python培训/s14/day6/cs.py 2 Alex ah...,I got shot... 3 Alex 彻底死了..... 4 5 Process finished with exit code 0
这个时候在原有的基础上实例化r2
1 r2 = Role('Jack', 'terrorist', 'B22') 2 r2.got_shot()
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/cs.py
2 Alex ah...,I got shot...
3 Jack ah...,I got shot...
4 Alex 彻底死了.....
5 Jack 彻底死了.....
6
7 Process finished with exit code 0
将上述的代码进行修改:
1 r1 = Role('Alex', 'police', 'AK47') #生成一个角色 实例化,也叫作初始化
2
3 r1.got_shot()
4 del r1
5
6 r2 = Role('Jack', 'terrorist', 'B22')
7 r2.got_shot()
这个时候的运行效果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/cs.py
2 Alex ah...,I got shot...
3 Alex 彻底死了.....
4 Jack ah...,I got shot...
5 Jack 彻底死了.....
6
7 Process finished with exit code 0
从上述可以总结出:只要实例没有了,就会执行析构函数
5、私有方法,私有属性
在初始化的时候代码如下:
1 self.__life_value = life_value
这个时候实例化时候是不能直接访问的如果想要访问需要在类里面添加一个方法:
1 def show_status(self): 2 print("%s %s %s" %(self.name,self.weapon,self.__life_value))
打印结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/cs.py 2 Alex ah...,I got shot... 3 Alex AK47 100 4 5 Process finished with exit code 0
6、继承
继承是指:它可以使用现有类的所有功能,并无需重新编写原来的类的情况下对这些功能进行扩展
通过继承创建的新类称为“子类”或“派生类”
被继承的类称为“基类”、”父类”或者“超类”
一个简单的继承代码:
1 class People(object): #新式类2 def __init__(self,name,age):3 self.name = name4 self.age = age5 def eat(self):6 print("%s is eating。。。。" %self.name)7 def sleep(self):8 print("%s is sleeping。。。。" %self.name)9 def talk(self):
10 print("%s is talking。。。。" %self.name)
11
12 class Man(People):
13 pass
14
15 m1 = Man("dean",22)
16 m1.eat()
运行效果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/继承1.py 2 dean is eating。。。。 3 4 Process finished with exit code 0
同时也可以在自己的里面写方法:
1 class Man(People): 2 def song(self): 3 print("%s is sing。。。。" %self.name)
运行效果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/继承1.py 2 dean is eating。。。。 3 dean is sing。。。。 4 5 Process finished with exit code 0
将代码再次修改
1 class Man(People):2 def song(self):3 print("%s is sing。。。。" %self.name)4 def sleep(self):5 People.sleep(self)6 print("Man is sleeping")7 m1 = Man("dean",22)8 m1.eat()9 m1.song()
10 m1.sleep()
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/继承1.py
2 dean is eating。。。。
3 dean is sing。。。。
4 dean is sleeping。。。。
5 Man is sleeping
6
7 Process finished with exit code 0
增加一个新的类:
1 class Woman(People):2 def get_birth(self):3 print("%s is born a baby。。。" %self.name)4 5 m1 = Man("dean",22)6 m1.eat()7 m1.song()8 m1.sleep()9 w1 = Woman("jack" ,23)
10 w1.get_birth()
1 D:\python35\python.exe D:/python培训/s14/day6/继承1.py
2 dean is eating。。。。
3 dean is sing。。。。
4 dean is sleeping。。。。
5 Man is sleeping
6 jack is born a baby。。。
7
8 Process finished with exit code 0
在Man类下面添加如下代码:
1 class Man(People):2 def __init__(self,name,age,money):3 People.__init__(self,name,age)4 self.money = money5 print("%s 一出生就有%s钱" %(self.name,self.money))6 7 m1 = Man("dean",22,10000)8 m1.eat()9 m1.song()
10 m1.sleep()
11
12 w1 = Woman("jack" ,23)
13 w1.get_birth()
或
1 class Man(People): 2 def __init__(self,name,age,money): 3 super(Man, self).__init__(name,age) 4 self.money = money 5 print("%s 一出生就有%s钱" %(self.name,self.money))
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/继承1.py
2 dean 一出生就有10000钱
3 dean is eating。。。。
4 dean is sing。。。。
5 dean is sleeping。。。。
6 Man is sleeping
7 jack is born a baby。。。
8
9 Process finished with exit code 0
关于类的写法:
1 class People: #经典类 2 class People(object): #新式类
关于多继承
在上述代码的基础上添加一个新类:
1 class Relation(object): 2 3 def make_friends(self,obj): 4 print("%s is making friends with %s" %(self.name,obj.name))
并在Man类和Woman类上都添加上继承:
1 class Man(People,Relation): 2 class Woman(People,Relation):
下面是调用:
1 m1 = Man("dean",22,10000) 2 w1 = Woman("jack" ,23) 3 m1.make_friends(w1)
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/继承1.py 2 dean is making friends with jack 3 4 Process finished with exit code 0
用上面的方法就是先了多继承
如果我将继承的顺序换一下:
class Man(Relation,People):
因为查找的时候先查找自己的构造函数,如果自己有了就用自己的,如果没有了才会找父类的
7、 关于继承中的广度优先和深度优先:
1 class A:2 def __init__(self):3 print("A")4 5 class B(A):6 def __init__(self):7 print("B")8 9 class C(A):
10 def __init__(self):
11 print("C")
12
13 class D(B,C):
14 pass
15 obj = D()
针对上述代码:(B继承A,C继承A,D同时继承B,C)
运行结果如下:(由于当有多个继承的时候是从左往右继承所以打印了B,也就是继承了B)
1 D:\python35\python.exe D:/python培训/s14/day6/多继承的区别.py 2 B 3 4 Process finished with exit code 0
将代码进行更改:
1 class A:2 def __init__(self):3 print("A")4 5 class B(A):6 pass7 # def __init__(self):8 # print("B")9
10 class C(A):
11 def __init__(self):
12 print("C")
13
14 class D(B,C):
15 pass
16 obj = D()
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/多继承的区别.py 2 C 3 4 Process finished with exit code 0
可以看出当B没有的时候,继承了C
将代码再次更改:
1 class A:2 def __init__(self):3 print("A")4 5 class B(A):6 pass7 # def __init__(self):8 # print("B")9
10 class C(A):
11 pass
12 # def __init__(self):
13 # print("C")
14
15 class D(B,C):
16 pass
17 obj = D()
运行结果如下:
1 D:\python35\python.exe D:/python培训/s14/day6/多继承的区别.py 2 A 3 4 Process finished with exit code 0
从这里看出最终才继承了A
上述的表现就是广度优先
在python3中只存在广度优先
即如下图所示:
相关文章:
python之面向对象编程
1、面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2、 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的…...
常见前端基础面试题(HTML,CSS,JS)(七)
同源策略 浏览器有一个重要的安全策略,称之为同源策略 其中,协议、端口号、域名必须一致,,称之为同源,两个源不同,称之为跨源或跨域 同源策略是指,若页面的源和页面运行过程中加载的源不一致…...
产业链金风控基本逻辑
产业链金风控基本逻辑 产业链金融平台作为一个助贷平台,很大程度上是为银行等金融机构进 行引流,贷款的审批本质上还是依赖金融机构的风控。那么,产业链金融 平台是否还有必要建设自己的风控模型呢?笔者给出的答案是肯定的。 一方面&#x…...
Java高级点的知识
Java 集合框架 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。 对一个集合的扩展和适应…...
MyBatis - 05 - 封装SqlSessionUtil工具类(用于获取SqlSession对象)并测试功能
文章目录1.新建SqlSessionUtils工具类2.编写静态方法3.项目结构及代码项目结构数据库和表pom.xmlParameterMapper接口:User类:ParameterMapper.xmljdbc.propertieslog4j.xml:mybatis-config.xml:ParameterMapperTest测试类:测试结果1.新建Sql…...
Java中BIO、NIO和AIO的区别和应用场景
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信&#…...
Python安装教程(附带安装包)
首先,打开python安装包的下载地址,https://www.python.org/downloads/,会有些慢 点击downloads中的windows 左侧是稳定的版本,我这边下的是3.8的,不想去官网下载的可以直接用我下载的这个3.8版本,https://…...
华为OD机试用Python实现 -【信号发射和接收】(2023-Q1 新题)
华为OD机试题 华为OD机试300题大纲信号发射和接收题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明Python 代码实现代码运行结果代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为…...
Springboot整合 Thymeleaf增删改查一篇就够了
很早之前写过Thymeleaf的文章,所以重新温习一下,非前后端分离,仅仅只是学习 官网: https://www.thymeleaf.org/ SpringBoot可以快速生成Spring应用,简化配置,自动装配,开箱即用。 JavaConfigur…...
BigScience bloom模型
简介项目叫 BigScience,模型叫 BLOOM,BLOOM 的英文全名代表着大科学、大型、开放科学、开源的多语言语言模型。拥有 1760 亿个参数的模型.BLOOM 是去年由 1000 多名志愿研究人员,学者 在一个名为“大科学 BigScience”的项目中创建的.BLOOM 和今天其他可用大型语言模型存在的一…...
Squid服务的缓存概念
Squid缓存概念 squid是一个缓存服务器的守护进程 之前涉及的缓存服务:redis 2-8原则:80%的访问就是从20%的数据提供的;因此把20%的数据给到缓存–>完美解决等待时间; nginx是没有缓存的服务的;那么专业的事情就…...
Hadoop YARN
目录Hadoop YARN介绍Hadoop YARN架构、组件程序提交YARN交互流程YARN资源调度器Scheduler调度器策略FIFO SchedulerCapacity SchedulerFair SchedulerHadoop YARN介绍 YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度 上图࿱…...
使用 Macrobenchmark 测试 Android 应用性能
etpack Compose 是推荐用于构建原生 Android 界面的新工具包。后续简称Jetpack Compose为Compose。在了解State之前需要先对Compose及申明性编程式有个大概的了解。State初体验好了,在你有一定了解的基础上,我们先来运行几个Demo,初步了解为何…...
【django】django-simpleui配置后,后台显示空白页解决方法
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 django后台显示空白页解决方法 1. 正文 添加完simpleui以后,后台显示一片空白,一脸问号??? …...
【035】基于Vue的电商推荐管理系统(含源码数据库、超详细论文)
摘 要:基于Vue+Nodejs+mysql的电商推荐管理系统,这个项目论文超详细,er图、接口文档、功能展示、技术栈等说明特别全!!! (文末附源码数据库、课设论文获取方式࿰…...
【c++】模板1—函数模板
文章目录函数模板语法函数模板注意事项案例—数组选择排序普通函数和函数模板的区别普通函数和函数模板调用规则模板的局限性函数模板语法 函数模板作用: 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表…...
windows10 wsl子系统固定ip启动分配网卡法
WSL设置添加固定IP 在Win端添加一个固定IP 192.168.50.99 用于X-Server界面显示.在WSL端添加一个固定IP 192.168.50.16 用于和Win端通讯 在win端创建批处理文件 创建一个批处理文件 我的文件位置是D:\powershell\static_ip.bat 向vEthernet (WSL)网卡添加一个IP 192.168.50.…...
ARM+Linux日常开发笔记
ARMLinux开发命令 文章目录ARMLinux开发命令一、虚拟机1.ssh服务项目2.文件相关3.系统相关4. 虚拟机清理内存二、ARM核板1.设备重启三、调试1. 应该调试一、虚拟机 1.ssh服务项目 启动ssh服务 sudo /etc/init.d/ssh restart2.文件相关 查看文件大小显示kb ll -h 查看目录文件…...
在线文档技术-编辑器篇
这是在线文档技术的第二篇文章,本文将对目前市面上所有的主流编辑器和在线文档进行一次深入的剖析和研究,从而使大家对在线文档技术有更深入的了解,也让更多人能够参与其开发与设计中来。 注意:出于对主流文档产品的尊重…...
top -p pid为什么超过100%
CPU:Cores, and Hyper-Threading 超线程(Hyper-Threading ) 超线程是Intel最早提出一项技术,最早出现在2002年的Pentium4上。单个采用超线程的CPU对于操作系统来说就像有两个逻辑CPU,为此P4处理器需要多加入一个Logic…...
#高光谱图像分类#:分类的方法有哪些?
高光谱图像分类方法可以根据分类粒度的不同分为基于像素的分类和基于对象的分类 高光谱图像分类方法可以根据分类粒度的不同分为基于像素的分类和基于对象的分类。 基于像素的分类:这种分类方法是针对每个像素进行分类,将像素的光谱信息作为输入特征&am…...
观察者模式
观察者模式常常用于以下场景:事件驱动系统:当事件发生时,通知所有对该事件感兴趣的观察者。发布/订阅模型:一个主题(发布者)可以有多个订阅者(观察者),当主题发生改变时&…...
前端组件库自定义主题切换探索-03-webpack-theme-color-replacer webpack 同时替换多个颜色改造
接上一篇《前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-02》 这篇我们来开始改造,让这个插件最终能达到我们的目的: 首先修改plugin.config.js。 插件首先要在vue.config.js引用注册,因此先对…...
Redis高级-主从复制相关操作
2.1 主从复制简介 2.1.1 高可用 首先我们要理解互联网应用因为其独有的特性我们演化出的三高架构 高并发 应用要提供某一业务要能支持很多客户端同时访问的能力,我们称为并发,高并发意思就很明确了 高性能 性能带给我们最直观的感受就是:速…...
SPI总线设备驱动模型
SPI总线设备驱动模型 文章目录SPI总线设备驱动模型参考资料:一、平台总线设备驱动模型二、 数据结构2.1 SPI控制器数据结构2.2 SPI设备数据结构2.3 SPI设备驱动三、 SPI驱动框架3.1 SPI控制器驱动程序3.2 SPI设备驱动程序致谢参考资料: 内核头文件&…...
开发同事辞职,接手到垃圾代码怎么办?
小王新加入了一家公司,这家公司有点年头,所以连屎山都是发酵过的,味道很冲。和大多数时运不济的程序员一样,到了这种公司,做的大多数工作,就是修补这些祖传代码,为其添砖加瓦。每当被折腾的筋疲…...
gRPC简介
grpc简介 grpc介绍可以参考官网。无论是rpc还是grpc,可以这样理解,都知道过去使用的单单体架构,而在2011年5月威尼斯的一个软件架构会议上提出了微服务架构,围绕业务功能进行组织(organized around business capability)…...
《MySQL系列-InnoDB引擎25》表-InnoDB逻辑存储结构
InnoDB逻辑存储结构 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block),InnoDB存储引擎的逻辑存储结构…...
YOLOv8之C2f模块——与YOLOv5的C3模块对比
一、源码对比 YOLOv8完整工程代码下载:ultralytics/ultralytic C2f模块源码在ultralytics/nn/modules.py下,源码如下: class C2f(nn.Module):# CSP Bottleneck with 2 convolutionsdef __init__(self, c1, c2, n1, shortcutFalse, g1, e…...
动态规划实例——换零钱的方法数(C++详解版)
原写了 Java 版本的如何求解换钱的方法数,近期进行了一些细节上的补充,以及部分错误更正,将语言换为了 C 语言。 基础题目 假设你现在拥有不限量的 1 元、5 元、10 元面值纸币,路人甲希望找你换一些零钱,路人甲拿出的…...
西部数码做网站/白度指数
相似软件版本说明软件地址V2.5.7查看1.4.9200 官方版查看1.0 官方版查看360超级root是一款成功率最高、支持手机机型最多的安全一键ROOT工具,360超级root拥有着非常强大的root的能力,软件机型支持丰富,可快速识别用户手机型号,并且…...
温州市网页制作项文静/关键词优化教程
今天在解决爬虫对加密参数的分析时,需要使用到base64解码。但是过程中出现了TypeError:Incorrect padding的错误提示。以下是解决方法,以便查阅。 其实正常使用base64是不会出现问题的,就比如下面的代码。 1 #!usr/bin/env pytho…...
汕头吧 百度贴吧/优化疫情防控措施
2019独角兽企业重金招聘Python工程师标准>>> $(document).mousedown(function(e) {var clientY e.clientY;// .panel-body为需要点击滑动的容器,需要加style"overflow: auto;"var scrollTop $(.panel-body)[0].scrollTop;$(document).mousem…...
大型平面设计网站/seo站内优化包括
% 注意哦,Matlab中的图节点要从1开始编号,所以这里把0全部改为了9 % 编号最好是从1开始连续编号,不要自己随便定义编号 s [9 9 1 1 2 2 2 7 7 6 6 5 5 4]; t [1 7 7 2 8 3 5 8 6 8 5 3 4 3]; w [4 8 3 8 2 7 4 1 6 6 2 14 10 9]; G g…...
sae wordpress 上传图片/百度网站登录
4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…...
网站建设要学编程吗/北京优化核酸检测
(本文略长,8000余字,大约需要花费10分钟,但值得你认真读完)“快十年了,我们很多人心里是憋着一股气的。”丛真作为盛斗士的代表,在美国盛大公司办公室里,终于有机会当面对陈天桥表达…...