版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象概念Python物联网面向对象概念面向对象面向对象编程(Object-orientedProgramming,简称OOP),是一种封装代码的方法,Python面向对象,有“一切皆对象”的说法。在面向对象中最重要的就是类,类是用来描述具有相同属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。面向对象概念面向对象产生过程面向对象第一阶段:面向机器,1940年以前最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据。简单来说,就是直接编写0和1的序列来代表程序语言。例如:使用0000代表加载(LOAD),0001代表存储(STORE)等。优点:机器语言由机器直接执行,速度快;缺点:写比较困难,修改也麻烦,这样直接导致程序编写效率十分低下,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。面向对象的产生面向对象由于机器语言实在是太难编写了,于是就发展出了汇编语言。汇编语言亦称符号语言,用助记符代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在一定程度上简化了编程过程。例如使用LOAD来代替0000,使用STORE来代替0001。即使汇编语言相比机器语言提升了可读性,但其本质上还是一种面向机器的语言,编写同样困难,也很容易出错。面向对象的产生面向对象第二阶段:面向过程面向机器的语言通常情况下被认为是一种“低级语言”,为了解决面向机器的语言存在的问题,计算机科学的前辈们又创建了面向过程的语言。面向过程的语言被认为是一种“高级语言”,相比面向机器的语言来说,面向过程的语言已经不再关注机器本身的操作指令、存储等方面,而是关注如何一步一步的解决具体的问题,即:解决问题的过程,这应该也是面向过程说法的来由。面向对象的产生面向对象相比面向机器的思想来说,面向过程是一次思想上的飞跃面向过程的语言将程序员从复杂的机器操作和运行的细节中解放出来,转而关注具体需要解决的问题;面向过程的语言也不再需要和具体的机器绑定,从而具备了移植性和通用性;面向过程的语言本身也更加容易编写和维护。大大减轻了程序员的负担,提升了程序员的工作效率,从而促进了软件行业的快速发展。典型的面向过程的语言有:COBOL、FORTRAN、BASIC、C语言等。面向对象的产生面向对象3.第三阶段:结构化程序设计面向过程语言的问题面向过程语言中的goto语句导致的面条式代码,极大的限制了程序的规模。结构化程序设计:针对大型的软件,人们将软件的结构进行了优化,即采用结构化程序设计(英语:Structuredprogramming。它是一种编程范型采用子程序(函数就是一种子程序)、代码区块、for循环以及while循环等结构,来替换传统的goto。希望借此来改善计算机程序的明晰性、质量以及开发时间,并且避免写出面条式代码。面向对象的产生面向对象随着计算机硬件的飞速发展,以及应用复杂度越来越高,软件规模越来越大,原有的程序开发方式已经越来越不能满足需求了。1960年代中期开始爆发了第一次软件危机,典型表现有软件质量低下、项目无法如期完成、项目严重超支等,因为软件而导致的重大事故时有发生。例如1963年美国的水手一号火箭发射失败事故,就是因为一行FORTRAN代码错误导致的。
结构化程序设计、软件工程作为两种解决软件危机的方案被提出来了。结构化程序设计本质上还是一种面向过程的设计思想,但通过“自顶向下、逐步细化、模块化”的方法,将软件的复杂度控制在一定范围内,从而从整体上降低了软件开发的复杂度。结构化程序方法成为了1970年代软件开发的潮流。面向对象的产生第四阶段:面向对象程序设计结构化编程的风靡在一定程度上缓解了软件危机,然而好景不长,随着硬件的快速发展,业务需求越来越复杂,第二次软件危机很快就到来了。第二次软件危机的根本原因还是在于软件生产力远远跟不上硬件和业务的发展,相比第一次软件危机主要体现在“复杂性”,第二次软件危机主要体现在“可扩展性”、“可维护性”上面。传统的面向过程(包括结构化程序设计)方法已经越来越不能适应快速多变的业务需求了。面向对象程序设计面向对象的思想早在1967年的Simula语言中就开始提出来了,但第二次软件危机促进了面向对象的发展。面向对象的思想更加贴近人类思维的特点,更加脱离机器思维,是一次软件设计思想上的飞跃。一切皆对象,对象由类派生,有属性和方法,继承父类的属性和行为……面向对象真正开始流行是在1980s年代,主要得益于C++的功劳,后来的Java、C#把面向对象推向了新的高峰。面向对象已经成为了主流的开发思想。面向对象的产生谢谢观看类和对象江苏电子职业学院Python物联网01类和对象的概念面向对象对象概念结论对象是指具体的事物,具有静态的特征和动态的行为或用途。在面向对象程序设计语言中静态的特征称为属性,动态的行为或用途称为方法特征:内容,书名,作者,页数,是否能借到用途:陶冶情操,丰富视野面向对象类的概念类:对具体事物的一般特征进行的抽象描述;换句话说,类是具有相同属性和行为的一组对象的集合;类也有属性和行为;抽象性思维是人的天性;这样一些对象我们称之为汽车这样一些对象我们称之为书面向对象类和对象的区别
类是概念模型,定义对象的所有特性和所需的操作对象是真实的模型类和对象类定义实体对象是实际的实体类是对象的原型所有属于同一个类的对象都具有相同的特性和操作类:人对象:学号为31113101的学生02类和对象的定义类定义对象创建类和对象的定义所有属于同一个类的对象都具有相同的特性和操作Python使用class关键字来定义类,class关键字之后是一个空格,然后是类的名字,再然后是一个冒号,最后换行并定义类的内部实现。类名的首字母一般要大写,当然也可以按照自己的习惯定义类名,但一般推荐参考惯例来命名,并在整个系统的设计和实现中保持风格一致,这一点对于团队合作尤其重要。类中要定义一个方法,除了第一个参数是self外,其他和普通函数一样。属性定义同变量定义一致,分为类属性和对象属性两种。对象属性通过构造方法赋值。定义类之后,可以实例化对象,并通过“对象名.成员”来访问其中的数据成员或成员方法。car=Car("苏H11111",18.5)r()classCar:carcount=0def__init__(self,carno,price):self.carno=carnoself.price=pricedefinfor(self):print("thecaris{},priceis{}".format(self.carno,self.price))课题演示课堂练习所有属于同一个类的对象都具有相同的特性和操作创建员工类Employee,包括一个员工人数属性,一个构造方法进行姓名和工资的初始化,一个显示输出的方法输出员工人数,一个显示输出方法输出当前员工姓名和工资;创建对象,调用方法。classEmployee:empCount=0def__init__(self,name,salary):=nameself.salary=salaryEmployee.empCount+=1defdisplayCount(self):print("TotalEmployee:{}".format(Employee.empCount))defdisplayEmployee(self):print("Name:{},Salary:{}".format(,self.salary))#"创建Employee类的第一个对象"emp1=Employee("Zara",2000)emp1.displayCount()emp1.displayEmployee()#"创建Employee类的第二个对象"emp2=Employee("Manni",5000)emp2.displayCount()emp2.displayEmployee()类定义对象创建pass关键字所有属于同一个类的对象都具有相同的特性和操作Python提供了一个关键字“pass”,类似于空语句,可以用在类和函数的定义中或者选择结构中。当暂时没有确定如何实现功能,或者为以后的软件升级预留空间,或者其他类型功能时,可以使用该关键字来“占位”。classA:
pass
defdemo(self):
pass
a=A()
a.demo()self关键字所有属于同一个类的对象都具有相同的特性和操作类的所有实例方法都有一个名为self的参数,并且是方法的第一个形参(如果有多个形参的话),self参数代表将来要创建的对象本身。在类的实例方法中访问实例属性时需要以self为前缀。def__init__(self,name,salary):
self.name=name#实例方法中访问实例属性时需要以self为前缀。
self.salary=salaryEmployee.empCount+=1self关键字类的所有实例方法都有一个名为self的参数,并且是方法的第一个形参(如果有多个形参的话),self参数代表将来要创建的对象本身。在外部通过对象名调用对象方法时并不需要传递这个参数。如果在外部通过类名调用对象方法则需要显式为self参数传值。#在通过对象名调用对象方法时不需要传递self参数值。emp1=Employee("Zara",2000)emp1.displayCount()emp1.displayEmployee()#通过类名调用对象方法则需要显式为self参数传值。Employee.displayEmployee(emp1)谢谢观看类和对象相关方法江苏电子职业学院Python物联网01构造方法类定义对象创建构造方法所有属于同一个类的对象都具有相同的特性和操作Python中类的构造函数是__init__(),一般用来为数据成员设置初值或进行其他必要的初始化工作,在创建对象时被自动调用和执行。若用户没有定义构造函数,Python将提供一个默认的构造函数用来进行必要的初始化工作。对象(实例)的数据成员一般是指在构造函数__init__()中定义的,定义和使用时必须以self作为前缀;类的数据成员是在类中所有方法之外定义的。在主程序中(或类的外部),实例(对象)属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名或对象名都可以访问。构造方法所有属于同一个类的对象都具有相同的特性和操作1.定义类属性;2.定义构造方法;3.定义对象属性;4.对象属性的访问;5.类属性的访问。classEmployee:empCount=0#类属性#定义构造方法def__init__(self,name,salary):#name,salary为对象属性=nameself.salary=salaryEmployee.empCount+=1#类属性可以通过类名访问defdisplayCount(self):print("TotalEmployee:{}".format(Employee.empCount))defdisplayEmployee(self):print("Name:{},Salary:{}".format(,self.salary))emp1=Employee("Zara",2000)emp1.displayCount()#对象访问对象属性emp1.displayEmployee()print(emp1.empCount)#对象可以访问类属性02动态添加成员类定义对象创建动态添加成员所有属于同一个类的对象都具有相同的特性和操作在Python中比较特殊的是,可以动态地为类和对象增加成员,这一点是和很多面向对象程序设计语言不同的,也是Python动态类型特点的一种重要体现。俗称混入(mixin)机制。这一特性在大型项目开发中会非常方便和实用,系统可扩展性强。例如系统中的所有用户分类非常复杂,不同用户组具有不同的行为和权限,并且可能会经常改变。这时候我们可以独立地定义一些行为,然后根据需要来为不同的用户设置相应的行为能力。还可以通过del删除成员。delemp1.setLevel;Employee.typename。
举例动态添加成员所有属于同一个类的对象都具有相同的特性和操作importtypes
fromtestimportEmployee
Employee.typename="全职"#新增类属性
#定义方法setLevel
defsetLevel(self,s):
Employee.typename="兼职"#方法中修改类属性
print("该员工是:"+s+","+Employee.typename)
emp1=Employee("Zara",2000)
#利用types.MethodType,将方法setLevel绑定到对象emp1中;
#第一个参数是要绑定的方法,第二个参数是要绑定的对象,第三个参数是类名(可省略)
emp1.setLevel=types.MethodType(setLevel,emp1)
emp1.setLevel("销售员")课题练习所有属于同一个类的对象都具有相同的特性和操作定义Person类,构造方法初始化name属性,定义sing()方法,输出XXX会唱歌。类外定义方法walk和eat;通过添加成员,将上述两方法添加到对象中,并调用测试。importtypes
classPerson(object):
def__init__(self,name):
self.name=name
defsing(self):
print(self.name+'cansing.')
defwalk(self):
print(+'canwalk.')
defeat(self):
print(+"caneat.")
zhang=Person("zhang")
zhang.sing()
zhang.walk=types.MethodType(walk,zhang)
zhang.walk()03析构函数类定义对象创建析构函数所有属于同一个类的对象都具有相同的特性和操作Python中类的析构函数是__del__(),一般用来释放对象占用的资源,在Python删除对象和收回对象空间时被自动调用和执行。如果用户没有编写析构函数,Python将提供一个默认的析构函数进行必要的清理工作。classPerson(object):
def__init__(self,name):
self.name=name
defsing(self):
print(self.name+'cansing.')
def__del__(self):
print("对象删除或者回收时自动调用我")
zhang=Person("zhang")
zhang.sing()
delzhangzhangcansing.对象删除或者回收时自动调用我类定义对象创建课堂练习所有属于同一个类的对象都具有相同的特性和操作定义一个计算机类MyComputer它包含一个类属性,产量,三个对象属性,CPU类型(字符串),RAM内存大小(整型),硬盘大小(整型),设计它的构造函数初始化并递增产量,设计一个显示电脑信息的函数,建立对象并调用显示函数显示电脑信息。类添加一个输出产量的方法,添加到对象中,并调用测试。谢谢观看面向对象三大特性江苏电子职业学院Python物联网01封装面向对象封装概念所有属于同一个类的对象都具有相同的特性和操作面向对象程序设计有三大特性:封装、继承、多态,其最重要的一个特性就是封装。一个软件系统运行就是不同的类(模块)相互作用的结果。为了保证软件系统运行的稳定性、可扩展性我们希望做到模块内部高内聚、模块间低耦合。封装面向对象程序设计,通过类把属性和行为整合到一块,一个类就是一个模块。为了实现高内聚低耦合的特点,封装到对象或者类中的属性或方法,我们还可以严格控制对它们的访问权限。Python中可以有隐藏属性和方法。我们可以隐藏重要的属性和操作,提供接口方法对外提供服务,从而隐藏了内部的复杂逻辑。面向对象封装所有属于同一个类的对象都具有相同的特性和操作classFoo:def__init__(self,name,age):=nameself.age=agedefinfor(self):print("name:{},age:{}".format(,self.age))……obj1=Foo('wupeiqi',18)r()属性name,age和方法infor被封装到了类Foo中。类Foo作为一个整体对外提供服务或者对外寻求服务。通过创建对象,实参‘wupeiqi’,18被封装到了对象obj1中。访问限制所有属于同一个类的对象都具有相同的特性和操作访问限制-私有属性Python采用双下划线开头的方式将属性隐藏起来(设置成私有的)。在类的外部不能直接访问双下划线开头的私有属性。但是在类内部是可以直接访问双下划线开头的私有属性的。classStudent:
def__init__(self,inname,inage):
self.name=inname
self.__age=inage#将age设为私有__age
definfor(self):#类内部可以访问私有属性
print("name:{},age:{}".format(self.name,self.__age))
obj1=Student('wupeiqi',18)
r()
print()#能访问到
print(obj1.__age)#访问不到。
r()注意:不能通过=“aaaa”或obj1.__age=11去验证,不会报错,因为Python支持添加属性。访问限制所有属于同一个类的对象都具有相同的特性和操作访问限制-私有属性将数据隐藏起来就限制了类外部对数据的直接操作。此时类内应该提供相应的接口来允许类外部间接地操作数据。我们在设计接口时可以添加逻辑来对数据的操作进行严格地控制。在Python中,类似__xxx__的变量,以双下划线开头,并且以双下划线结尾的,是特殊变量,是可以直接访问的,不是私有变量。classStudent:def__init__(self,inname,inage):=innameself.__age=inagedefinfor(self):print("name:{},age:{}".format(,self.__age))#对外提供设置age接口,并附加类型检查的逻辑
defset_info(self,upage):ifisinstance(upage,int):self.__age=upageelse:raiseTypeError("age必须是整数")s1=Student("wulei",19)r()s1.set_info(20)r()访问限制所有属于同一个类的对象都具有相同的特性和操作访问限制-私有属性classATM:def__card(self):#插卡,隐藏函数
print('插卡')def__auth(self):#身份认证,隐藏函数
print('用户认证')def__input(self):#输入金额,隐藏函数
print('输入取款金额')def__print_bill(self):#打印小票,隐藏函数
print('打印账单')def__take_money(self):#取钱,隐藏函数
print('取款')def__take_exit(self):#退出,隐藏函数
print('退出')defwithdraw(self):#取款功能
self.__card()self.__auth()self.__input()self.__print_bill()self.__take_money()self.__take_exit()obj=ATM()obj.withdraw()同样在方法前面加双下划线,则该方法就被隐藏,如__init__()方法。就是一个私有方法,外部不能直接访问,只能通过创建自动访问。隐藏函数目的的是为了隔离复杂度,例如ATM程序的取款功能,该功能有很多其他功能组成,比如插卡、身份认证、输入金额、打印小票、取钱等,而对使用者来说,只需要取款这个功能接口即可,其余功能我们都可以隐藏起来。谢谢观看面向对象三大特性江苏电子职业学院Python物联网02继承面向对象继承概念所有属于同一个类的对象都具有相同的特性和操作继承这个概念在类拟于生物界中的遗传。后代具有先辈的特征和行为能力。在程序设计中继承是为代码复用和设计复用而设计的,是面向对象程序设计的重要特性之一。是指子类可以继承父类中已定义好的属性和方法(函数),而不需要重新定义,这样会大幅度减少开发工作量。在继承关系中,已有的、设计好的类称为父类或基类,新设计的类称为子类或派生类。classAnimal:passclassCat(Animal):#表示该类继承类Animalpass面向对象继承概念所有属于同一个类的对象都具有相同的特性和操作猫有:喵喵叫、吃、喝、拉、撒等行为;狗也有:汪汪叫、吃、喝、拉、撒等行为;如果我们要分别为猫和狗创建一个类,那么就需要为猫和狗分别实现他们所有的功能。为了提高效率,尽可能复用代码,我们可以把共同部分:吃、喝、拉、撒,抽象出来,定义一个猫和狗的父类。classCat(Animal):自动继续父类中的eat(),drink(),shit(),pee()方法,同时又有自己的cry()方法和属性name,breed。classAnimal:defeat(self):print("%s吃"%)defdrink(self):print("%s喝"%)defshit(self):print("%s拉"%)defpee(self):print("%s撒"%)classCat(Animal):def__init__(self,name):=nameself.breed="猫"defcry(self):print('喵喵叫')classDog(Animal):def__init__(self,name):=nameself.breed="狗"defcry(self):print("汪汪叫")面向对象继承原则所有属于同一个类的对象都具有相同的特性和操作派生类可以继承父类的公有成员,但是不能继承其私有成员。方法重写,子类中同名的方法会敷盖父类中同名的方法。这时如果需要在派生类中调用基类的方法,可以使用内置函数super()或者通过“基类名.方法名()”的方式来实现这一目的。面向对象重写所有属于同一个类的对象都具有相同的特性和操作子类Bar继承父类Foo,继承了方法f1和f2;b.f2()会在父类Foo中找到f2,先打印输出”父类中的方法f2”。接下来执行到self.f1(),即b.f1(),会按照:对象本身->类Bar->父类Foo的顺序依次查找。然后在子类中Bar中找到f1,输出“子类中的方法f1”classFoo:deff1(self):print("父类中的方法f1")deff2(self):print("父类中的方法f2")self.f1()classBar(Foo):#子类继承了方法f1,f2,同时又对f1进行了重写
deff1(self):print("子类中的方法f1")defdof(self):self.f1()super().f1()#调用父类中的方法b=Bar()b.f2()#调用继承来的方法f2b.dof()面向对象重写所有属于同一个类的对象都具有相同的特性和操作父类如果不想让子类继承或不想让子类覆盖自己的方法,可以采用双下划线开头的方式将方法设置为私有的。classFoo:def__f1(self):print("父类中的方法f1")deff2(self):print("父类中的方法f2")self.f1()classBar(Foo):#子类继承了方法f1,f2,同时又对f1进行了重写
def__f1(self):print("子类中的方法f1")b=Bar()b.f2()#调用继承来的方法f2未改写父类Foo中的方法__f1()面向对象多继承所有属于同一个类的对象都具有相同的特性和操作Python支持多继承如果父类中有相同的方法名,而在子类中使用时没有指定父类名,则Python解释器将从左向右按顺序进行搜索。多继承使用要慎用super()。classFather:def__init__(self):self.sex="男"defhobby(self):print("业余爱好是打游戏!")defwork(self):#两个父类中方法重名print("能做体力活")classMother:def__init__(self):self.sex="女"defcook(self):print("喜欢烹饪!")defwork(self):#两个父类中方法重名print("能有耐心的做事")classSon(Father,Mother):passson=Son()son.hobby()son.cook()son.work()#父类中相同的方法时,按顺序继承。print(son.sex)谢谢观看面向对象三大特性江苏电子职业学院Python物联网03多态面向对象多态概念所有属于同一个类的对象都具有相同的特性和操作所谓多态(polymorphism),是指基类的同一个方法在不同派生类对象中具有不同的表现和行为。派生类继承了基类行为和属性之后,还会增加某些特定的行为和属性;派出类还可能会对继承来的某些行为进行一定的改变,比如重写。Python大多数运算符可以作用于多种不同类型的操作数,并且对于不同类型的操作数往往有不同的表现,这本身就是多态,是通过特殊方法与运算符重载实现的。多态表现所有属于同一个类的对象都具有相同的特性和操作同一个方法talk()在不同派生类对象中具有不同的表现和行为。classAnimal:#同一类事物:动物
deftalk(self):passclassCat(Animal):#动物的形态之一:猫
deftalk(self):print('喵喵喵')classDog(Animal):#动物的形态之二:狗
deftalk(self):print('汪汪汪')classPig(Animal):#动物的形态之三:猪
deftalk(self):print('哼哼哼')cat=Cat()cat.talk()dog=Dog()dog.talk()pig=Pig()pig.talk()面向对象多态表现所有属于同一个类的对象都具有相同的特性和操作对于上一页的方法重写表现的多态,我们可以更进一步。我们可以定义一个统一的接口(方法)来使用talk()方法。
defdotalk(self,animal):
animal.talk()通过父类变量调用doalk()方法,传入子类对象。传入子类的对象不同,表现出不同的形态。classAnimal:#同一类事物:动物
deftalk(self):passdefdotalk(self,animal):animal.talk()classCat(Animal):#动物的形态之一:猫
deftalk(self):print('喵喵喵')classDog(Animal):#动物的形态之二:狗
deftalk(self):print('汪汪汪')classPig(Animal):#动物的形态之三:猪
deftalk(self):print('哼哼哼')a=Animal()#创建父类对象cat=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度大型水利工程采砂厂承包权转让合同范本3篇
- 二零二五版国际贸易合同主体欺诈责任划分与损害赔偿合同3篇
- 2025年度鲜羊奶品牌授权及区域代理销售合同范本3篇
- 2025年度出租车行业驾驶员权益保护合作协议3篇
- 2024版加油站柴油订货与销售协议范例版B版
- 专业水泥销售协议:2024版细则版A版
- 二零二五年度高压电缆敷设与维护保养合同大全3篇
- 2024版吉阳区环卫设施安全检查评估合同
- 2024技术岗位聘用合同范本
- 二零二五年度特色猪种养殖基地猪栏承包协议3篇
- 危险性较大分部分项工程及施工现场易发生重大事故的部位、环节的预防监控措施
- 继电保护试题库(含参考答案)
- 《榜样9》观后感心得体会四
- 2023事业单位笔试《公共基础知识》备考题库(含答案)
- 《水下抛石基床振动夯实及整平施工规程》
- 2025年云南大理州工业投资(集团)限公司招聘31人管理单位笔试遴选500模拟题附带答案详解
- 风电危险源辨识及控制措施
- 《教师职业道德与政策法规》课程教学大纲
- 儿童传染病预防课件
- 护理组长年底述职报告
- 《住院患者身体约束的护理》团体标准解读课件
评论
0/150
提交评论