Python 面向对象(初级篇)

2023-05-16

51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163

概述

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。

while True:
	if cpu利用率 > 90%:
		#发送邮件提醒
		连接邮箱服务器
		发送邮件
		关闭连接

	if 硬盘使用空间 > 90%:
		#发送邮件提醒
		连接邮箱服务器
		发送邮件
		关闭连接

	if 内存占用 > 80%:
		#发送邮件提醒
		连接邮箱服务器
		发送邮件
		关闭连接

随着时间的推移,开始使用了函数式编程,增强代码的重用性和可读性,就变成了这样:

def 发送邮件(内容)
	#发送邮件提醒
	连接邮箱服务器
	发送邮件
	关闭连接

while True:

	if cpu利用率 > 90%:
		发送邮件('CPU报警')

	if 硬盘使用空间 > 90%:
		发送邮件('硬盘报警')

	if 内存占用 > 80%:
		发送邮件('内存报警') 

今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程

创建类和对象

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

  类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

  对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

  • class是关键字,表示类
  • 创建对象,类名称后加括号即可

ps:类中的函数第一个参数必须是self(详细见:类的三大特性之封装)
   类中定义的函数叫做 “方法”

# 创建类
class Foo:
	
	def Bar(self):
		print 'Bar'

	def Hello(self, name):
		print 'i am %s' %name

# 根据类Foo创建对象obj
obj = Foo()
obj.Bar()            #执行Bar方法
obj.Hello('wupeiqi') #执行Hello方法 

诶,你在这里是不是有疑问了?使用函数式编程和面向对象编程方式来执行一个“方法”时函数要比面向对象简便

  • 面向对象:【创建对象】【通过对象执行方法】
  • 函数编程:【执行函数】

观察上述对比答案则是肯定的,然后并非绝对,场景的不同适合其的编程方式也不同。

总结:函数式的应用场景 --> 各个函数之间是独立且无共用的数据

面向对象三大特性

面向对象的三大特性是指:封装、继承和多态。

一、封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处
  • 从某处调用被封装的内容

第一步:将内容封装到某处

 self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

                              当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。

第二步:从某处调用被封装的内容

调用被封装的内容时,有两种情况:

  • 通过对象直接调用
  • 通过self间接调用

1、通过对象直接调用被封装的内容

上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名

class Foo:

	def __init__(self, name, age):
		self.name = name
		self.age = age

obj1 = Foo('wupeiqi', 18) 
print obj1.name    # 直接调用obj1对象的name属性
print obj1.age	   # 直接调用obj1对象的age属性

obj2 = Foo('alex', 73)
print obj2.name    # 直接调用obj2对象的name属性
print obj2.age     # 直接调用obj2对象的age属性

2、通过self间接调用被封装的内容

执行类中的方法时,需要通过self间接调用被封装的内容

class Foo:
 
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def detail(self):
        print self.name
        print self.age
 
obj1 = Foo('wupeiqi', 18)
obj1.detail()  # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18
 
obj2 = Foo('alex', 73)
obj2.detail()  # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78

综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

练习一:在终端输出如下信息

  • 小明,10岁,男,上山去砍柴
  • 小明,10岁,男,开车去东北
  • 小明,10岁,男,最爱大保健
  • 老李,90岁,男,上山去砍柴
  • 老李,90岁,男,开车去东北
  • 老李,90岁,男,最爱大保健
  • 老张...

def kanchai(name, age, gender):
    print "%s,%s岁,%s,上山去砍柴" %(name, age, gender)


def qudongbei(name, age, gender):
    print "%s,%s岁,%s,开车去东北" %(name, age, gender)


def dabaojian(name, age, gender):
    print "%s,%s岁,%s,最爱大保健" %(name, age, gender)


kanchai('小明', 10, '')
qudongbei('小明', 10, '')
dabaojian('小明', 10, '')


kanchai('老李', 90, '')
qudongbei('老李', 90, '')
dabaojian('老李', 90, '')  
函数式编程

class Foo:
    
    def __init__(self, name, age ,gender):
        self.name = name
        self.age = age
        self.gender = gender

    def kanchai(self):
        print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender)

    def qudongbei(self):
        print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender)

    def dabaojian(self):
        print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)


xiaoming = Foo('小明', 10, '')
xiaoming.kanchai()
xiaoming.qudongbei()
xiaoming.dabaojian()

laoli = Foo('老李', 90, '')
laoli.kanchai()
laoli.qudongbei()
laoli.dabaojian()  
面向对象

上述对比可以看出,如果使用函数式编程,需要在每次执行函数时传入相同的参数,如果参数多的话,又需要粘贴复制了...  ;而对于面向对象只需要在创建对象时,将所有需要的参数封装到当前对象中,之后再次使用时,通过self间接去当前对象中取值即可。

 

练习二:游戏人生程序

1、创建三个游戏人物,分别是:

  • 苍井井,女,18,初始战斗力1000
  • 东尼木木,男,20,初始战斗力1800
  • 波多多,女,19,初始战斗力2500

2、游戏场景,分别:

  • 草丛战斗,消耗200战斗力
  • 自我修炼,增长100战斗力
  • 多人游戏,消耗500战斗力

# -*- coding:utf-8 -*-

# #####################  定义实现功能的类  #####################

class Person:

    def __init__(self, na, gen, age, fig):
        self.name = na
        self.gender = gen
        self.age = age
        self.fight =fig

    def grassland(self):
        """注释:草丛战斗,消耗200战斗力"""

        self.fight = self.fight - 200

    def practice(self):
        """注释:自我修炼,增长100战斗力"""
        
        self.fight = self.fight + 200

    def incest(self):
        """注释:多人游戏,消耗500战斗力"""
        
        self.fight = self.fight - 500

    def detail(self):
        """注释:当前对象的详细情况"""

        temp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s"  % (self.name, self.gender, self.age, self.fight)
        print temp

        
# #####################  开始游戏  #####################

cang = Person('苍井井', '', 18, 1000)    # 创建苍井井角色
dong = Person('东尼木木', '', 20, 1800)  # 创建东尼木木角色
bo = Person('波多多', '', 19, 2500)      # 创建波多多角色

cang.incest() #苍井空参加一次多人游戏
dong.practice()#东尼木木自我修炼了一次
bo.grassland() #波多多参加一次草丛战斗


#输出当前所有人的详细情况
cang.detail()
dong.detail()
bo.detail()


cang.incest() #苍井空又参加一次多人游戏
dong.incest() #东尼木木也参加了一个多人游戏
bo.practice() #波多多自我修炼了一次

#输出当前所有人的详细情况
cang.detail()
dong.detail()
bo.detail()  
游戏人生

二、继承

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

例如:

  猫可以:喵喵叫、吃、喝、拉、撒

  狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,如下所示:


class 猫:

    def 喵喵叫(self):
        print '喵喵叫'

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

class 狗:

    def 汪汪叫(self):
        print '喵喵叫'

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something  
伪代码

上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,如下实现:

  动物:吃、喝、拉、撒

     猫:喵喵叫(猫继承动物的功能)

     狗:汪汪叫(狗继承动物的功能)


class 动物:

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物):

    def 喵喵叫(self):
        print '喵喵叫'
        
# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物):

    def 汪汪叫(self):
        print '喵喵叫'  
伪代码 

class Animal:

    def eat(self):
        print "%s 吃 " %self.name

    def drink(self):
        print "%s 喝 " %self.name

    def shit(self):
        print "%s 拉 " %self.name

    def pee(self):
        print "%s 撒 " %self.name


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = ''

    def cry(self):
        print '喵喵叫'

class Dog(Animal):
    
    def __init__(self, name):
        self.name = name
        self.breed = ''
        
    def cry(self):
        print '汪汪叫'
        

# ######### 执行 #########

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()  
代码实例

所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

学习了继承的写法之后,我们用代码来是上述阿猫阿狗的功能:


class Animal:

    def eat(self):
        print "%s 吃 " %self.name

    def drink(self):
        print "%s 喝 " %self.name

    def shit(self):
        print "%s 拉 " %self.name

    def pee(self):
        print "%s 撒 " %self.name


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = ''

    def cry(self):
        print '喵喵叫'

class Dog(Animal):
    
    def __init__(self, name):
        self.name = name
        self.breed = ''
        
    def cry(self):
        print '汪汪叫'
        

# ######### 执行 #########

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()  
代码实例

那么问题又来了,多继承呢?

  • 是否可以继承多个类
  • 如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

 


class D:

    def bar(self):
        print 'D.bar'


class C(D):

    def bar(self):
        print 'C.bar'


class B(D):

    def bar(self):
        print 'B.bar'


class A(B, C):

    def bar(self):
        print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()  
经典类多继承

class D(object):

    def bar(self):
        print 'D.bar'


class C(D):

    def bar(self):
        print 'C.bar'


class B(D):

    def bar(self):
        print 'B.bar'


class A(B, C):

    def bar(self):
        print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()  
新式类多继承

经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了

三、多态 

 Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”。


class F1:
    pass


class S1(F1):

    def show(self):
        print 'S1.show'


class S2(F1):

    def show(self):
        print 'S2.show'


# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
    """Func函数需要接收一个F1类型或者F1子类的类型"""
    
    print obj.show()
    
s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show  
Python伪代码实现Java或C#的多态

class F1:
    pass


class S1(F1):

    def show(self):
        print 'S1.show'


class S2(F1):

    def show(self):
        print 'S2.show'

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj)   
Python “鸭子类型”

总结 

以上就是本节对于面向对象初级知识的介绍,总结如下:

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

问答专区

问题一:什么样的代码才是面向对象?

答:从简单来说,如果程序中的所有功能都是用 类 和 对象 来实现,那么就是面向对象编程了。

问题二:函数式编程 和 面向对象 如何选择?分别在什么情况下使用?

答:须知:对于 C# 和 Java 程序员来说不存在这个问题,因为该两门语言只支持面向对象编程(不支持函数式编程)。而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。

所以,一般在Python开发中,全部使用面向对象面向对象和函数式混合使用

面向对象的应用场景:

  1. 多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码
    
    class SqlHelper:
    
        def __init__(self, host, user, pwd):
    
            self.host = host
            self.user = user
            self.pwd = pwd
    
        def 增(self):
            # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
            # do something
            # 关闭数据库连接
    
        def 删(self):
            # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
            # do something
            # 关闭数据库连接
    
        def 改(self):
            # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
            # do something
            # 关闭数据库连接
    
        def 查(self):
        # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
            # do something
            # 关闭数据库连接# do something  
    Demo
  2. 需要创建多个事物,每个事物属性个数相同,但是值的需求
    如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同
    
    class Person:
    
        def __init__(self, name ,age ,blood_type):
    
            self.name = name
            self.age = age
            self.blood_type = blood_type
    
    
        def detail(self):
            temp = "i am %s, age %s , blood type %s " % (self.name, self.age, self.blood_type)
            print temp
    
    zhangsan = Person('张三', 18, 'A')
    lisi = Person('李四', 73, 'AB')
    yangwu = Person('杨五', 84, 'A')  
    Demo

问题三:类和对象在内存中是如何保存?

答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:

如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类。

当通过 obj1 执行 【方法一】 时,过程如下:

  1. 根据当前对象中的 类对象指针 找到类中的方法
  2. 将对象 obj1 当作参数传给 方法的第一个参数 self 

 

以上是本篇文章的全部内容,如果觉得有点点意思,右边的推荐再等你哟 ! 下一篇《面向对象进阶篇》

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 面向对象(初级篇) 的相关文章

  • 【Python基础】request.post()方法

    00 序言 爬取懂che帝的车型信息时 xff0c 没太整明白request post 里面的参数是干什么用的 xff0c 所以写篇学习笔记提醒一下自己 url 61 39 https www dongchedi com motor bra
  • 老虎证券web端PWA实践总结

    历时两个月 xff0c PWA功能终于在web端稳定落地使用 xff0c 网站 web itiger com 从最新研究到落地上线 xff0c 遇到不少坑 xff1b 开发过程中也参考了不少资料 xff0c 但总有那么几个是没有答案 xff
  • 硬盘inode节点简单介绍

    一 inode是什么 xff1f 理解inode xff0c 要从文件储存说起 文件储存在硬盘上 xff0c 硬盘的最小存储单位叫做 34 扇区 34 xff08 Sector xff09 每个扇区储存512字节 xff08 相当于0 5K
  • NoMachine 远程桌面控制

    它是一个基于企业级对比套装的开源的终端服务器 它允许用户在连接速度缓慢或者窄带宽的情况下 xff0c 对X11会话进行远程访问 NX项目提供一整套的运行库文件以及优化的来自X11 xff0c SMB xff0c IPP xff0c HTTP
  • Angular之路--带你来搭建Webpack 2 + Angular 4项目

    上个月Angular发布了4 0 0版本 xff0c 少年们 xff0c 赶快学起来吧 xff0c 这篇文章带领大家搭建一个简单的Angular应用 xff0c 会尽量详细的把每个点都解释到 首先我选择了用webpack2来作为打包工具 x
  • C- unsigned :1之位域分析

    1 首先回忆结构体 我们都知道定义一个结构体可以这样的方式定义 struct Point float x float y point 等价于 struct Point point 除此之外 如果不想声明结构体 只想定义结构体的话 还可以这样
  • ShareSDK自定义UI的方法

    说明 xff1a 我们的分享菜单可以修改背景 xff0c 里面的图标以及文字 xff0c 颜色等 xff0c 另外可以自己自定义UI xff0c 用自己的方法写界面 xff0c 写好了之后可以调用我们以下无UI的分享方法 xff0c 另外我
  • HttpServletRequest & HttpServletResponse 中 Body 的获取

    为什么80 的码农都做不了架构师 xff1f gt gt gt 获取 HttpServletRequest 中的请求体 HttpServletRequest getInputStream 获取到请求的输入流 xff0c 从该输入流中可以读取
  • 图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

    特征描述子 Feature Descriptor 特征描述子就是图像的表示 xff0c 抽取了有用的信息 xff0c 丢掉了不相关的信息 通常特征描述子会把一个w h 3 宽高3 xff0c 3个channel 的图像转换成一个长度为n的向
  • SQL查询语句练习题27道

    练习环境为 xff1a XP 43 SQL2000 数据库 练习使用的数据库为 xff1a 学生管理数据库 数据库下载地址为 http download csdn net download friendan 4648150 说明 这是我在学
  • 使用IDEA社区版如何创建SpringBoot项目?

    Spring Boot 就是 Spring 框架的脚 架 xff0c 它就是为了快速开发 Spring 框架 诞 的 首先谈谈SpringBoot的优点 xff1a 1 快速集成框架 xff0c Spring Boot 提供了启动添加依赖的
  • 从零转行数据分析的亲身经历

    作者 xff1a xiaoyu 微信公众号 xff1a Python数据科学 知乎 xff1a python数据分析师 快两周没更新了 xff0c 先跟大家说一下抱歉 最近生活上确实有点忙 xff0c 不过后续将恢复正常 今天和大家聊一个非
  • NodeBB搭建,维护,discuz!数据迁移

    为什么选择了NodeBB 无法回答 NodeBB官方Github NodeBB中文论坛 NodeBB官方文档 NodeBB中文文档 安装 此处的方式是Docker安装部署 https hub docker com r nodebb dock
  • _vimrc

    为什么80 的码农都做不了架构师 xff1f gt gt gt code 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34
  • ubuntu编译qemu报错:‘ERROR: pixman >= 0.21.8 not present.’

    在ubuntu14 04中用源码方式编译安装qemu时 xff0c 执行 configure步骤提示错误 xff1a configure ERROR pixman gt 61 0 21 8 not present Your options
  • mysql my.conf 配置_Mysql my.conf配置说明

    MySQL配置文件my cnf 例子最详细翻译 可以保存做笔记用 BEGIN CONFIG INFO DESCR 4GB RAM 只使用InnoDB ACID 少量的连接 队列负载大 TYPE SYSTEM END CONFIG INFO
  • [译]使用 Rust 编写快速安全的原生 Node.js 模块

    原文地址 xff1a Writing fast and safe native Node js modules with Rust原文作者 xff1a Peter Czibik译文出自 xff1a 掘金翻译计划本文永久链接 xff1a gi
  • Discuz搭建论坛报错:advice_mysqli_connect

    环境说明 xff1a Ubuntu 12 04 3 四块硬盘RAID5 半个月前由于内部办公服务器由于RAID5两块盘出现问题 xff0c 导致部分数据丢失 xff0c 好在SVN数据是实时备份 xff0c 否则就真的哭了 xff0c 由于
  • c语言通讯录程序线性表,数据结构(C语言)课设1——单位员工通讯录管理系统(线性表应用)...

    数据结构 C语言 课设1 单位员工通讯录管理系统 线性表应用 题目要求 xff1a 为某个单位建立一个员工通讯录管理系统 xff0c 可以方便查询每一个员工的手机号 及电子邮箱 其功能包括通讯录链表的建立 员工通讯信息的查询 修改 插入与删
  • OpenStack企业云平台监控实践

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 摘要 xff1a OpenStack企业云平台架构与实践 结合作者亲身经历的各类OpenStack的咨询 规划和实施经验 xff0c 从理论和工程角度 xff0c 讲述如何

随机推荐

  • python将时间戳转换为指定时区时间

    直接上代码 根据时区代码 xff08 如 xff1a America New York xff09 转换 在这里我们使用pytz span class token keyword import span pytz ts span class
  • .NET常见错误大全

    NET常见错误大全 1 检测到有潜在危险的 Request Form 值 原因 1 在提交数据的页面或webconfig中没有对validateRequest的属性进行正确的设置 2 HTML里面写了两个 lt form gt 引起 解决
  • iOS 地图定位 定位

    定位 常用方法的介绍 CLLocationManager位置管理器 xff0c 我们的有关于位置的方法和属性都是通过它来管理设置的 43 BOOL locationServicesEnabled监测设备是否开启定位功能 void reque
  • Ubuntu出现“dpkg: 依赖关系问题使得libbsd0:i386的配置工作不能继续”错误

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Ubuntu在执行apt get upgrade时出现了错误 xff1a dpkg 处理软件包 libc6 i386 configure 时出错 xff1a install
  • android app崩溃日志分析,利用NDK崩溃日志查找BUG(android的C++错误查找)

    背景介绍 本文主要内容 利用android的crash log来对c 43 43 开发的android应用进行错误定位 容易稳定复现的BUG 一般可以通过断点调试来解决 如果测试人员也无法稳定复现 log就成了程序吊定位问题的救命稻草 通用
  • NET 中C#的switch语句的语法

    NET 中C 的switch语句的语法如下 switch xff0c case和default是关键字 xff1a switch controllingExpression case constantExpression statement
  • CentOS开启vnc服务

    CentOS开启vnc服务 vnc是一款远程控制工具软件 xff0c 能使xp远程linux系统并显示图形化桌面 1 CentOS端 xff1a mount dev cdrom media cdrom rpm ivh media cdrom
  • 12v服务器电源改可调_成本仅1元!仅用8个元件把QC3.0充电头变成最高12V的简易可调电源...

    随着QC快充的普及 xff0c 论坛几乎人手一个或多个QC3 0快充头 xff0c 大家都知道QC3 0 class a 协议里电压支持4 3v 12v 连续可调 步进0 2v xff0c 那么能不能用简单的方法低成本把快充头改造成简易可调
  • 从kinit到kerberos安全机制

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近老在项目的shell脚本中看到kinit这个东西 xff0c 完整的命令是 kinit k t conf kerberos keytab sherlocky admin
  • 关于iOS11中estimatedRowHeight

    相信大家都已经升级了iOS11 xff0c 而且也做了相应的适配 xff0c 其中对于tableView这个控件进行适配的时候 xff0c 比如 xff1a 集成MJRefresh的时候 xff0c 当然还有其他很多情况下 xff0c 很多
  • 为miniconda设置环境变量

    将安装目录下的Scripts和condabin文件夹的路径加入环境变量即可 以下为详细步骤 xff1a 1 打开环境变量页 右击我的电脑 gt 属性 gt 更多设置 gt 高级 gt 环境变量 gt 新建 2 填入路径 打开conda安装目
  • 启动ubuntu报"you need to load the kernel first"

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 我所用wubi安装的 xff0c 找到你wubi自动下载的那个镜像文件 xff0c 用winrar打开 xff0c 把casper目录中的vmlinuz和initrd lz
  • iOS: Crash文件解析(一)

    iOS Crash文件的解析 xff08 一 xff09 开发程序的过程中不管我们已经如何小心 xff0c 总是会在不经意间遇到程序闪退 脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候 xff0c 流畅的操作被无情地Crash
  • windows快捷键大全

    1 快速切换程序 xff1a Alt 43 Tab xff1b 2 永久删除文件Shift 43 Delete xff1b 3 秒开文件管理 xff1a Windows 43 E xff1b 4 直接显示桌面 xff1a Windows 4
  • mysql limit 用法-分页

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql已经为我们提供了这样一个
  • Knowledge Tracing -- 基于贝叶斯的学生知识点追踪(BKT)

    目前 xff0c 教育领域通过引入人工智能的技术 xff0c 使得在线的教学系统成为了智能教学系统 xff08 ITS xff09 xff0c ITS不同与以往的MOOC形式的课程 ITS能够个性化的为学生制定有效的 学习路径 xff0c
  • word显示计算机没有内存不足,Word提示内存或磁盘空间不足【解决方法】

    类型 xff1a 安卓软件 大小 xff1a 12 9MB 语言 xff1a 简体中文 Word提示内存或磁盘空间不足原因 近期很多用户打开Word系统会提示我们内存或磁盘空间不足 xff0c 其实这并非是我们电脑硬件或者系统的问题 xff
  • 中矿大 C 石头剪刀布【决策DP*待看/codeforces原题】

    时间限制 xff1a C C 43 43 1秒 xff0c 其他语言2秒 空间限制 xff1a C C 43 43 32768K xff0c 其他语言65536K 64bit IO Format lld 题目描述 齐齐和司机正在玩剪刀石头布
  • Python 面向对象(初级篇)

    51CTO同步发布地址 xff1a http 3060674 blog 51cto com 3050674 1689163 概述 面向过程 xff1a 根据业务逻辑从上到下写垒代码函数式 xff1a 将某功能代码封装到函数中 xff0c 日
  • 9个常用的开源工单系统

    工单系统 xff08 也称为问题跟踪系统 xff0c 故障工单系统 xff0c 支持工单或事件工单系统 xff09 是一个计算机软件包或基于Web的软件包 xff0c 用于管理和维护组织需要的问题列表 工单系统通常用于组织的创建 xff0c