失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 自定义模块+python面向对象+综合案例

自定义模块+python面向对象+综合案例

时间:2024-02-16 06:31:49

相关推荐

自定义模块+python面向对象+综合案例

一、模块

1.自定义模块

1.1import模块

代码演示:

moduleDemo01.py

def fun1():print("fun~~~~111")def fun2():print("fun~~~~222")def fun3():print("fun~~~~333")def fun4():print("fun~~~~444")num =10fun1()fun2()

moduleDemo02.py

def fun1():print("fun~~~~111")def fun2():print("fun~~~~222")

textDemo01.py

#2.如果需要导入的模块有多个,使用一个import,多个模块之间使用逗号隔开;也可以使用多个import,每个import相当于一条语句#import module01.moduleDemo01,module01.moduleDemo02import module01.moduleDemo01import module01.moduleDemo02#3.同一个模块如果被导入多次,只有第一次会加载源文件,其他的导入没有任何意义#【单例设计模式:只有当第一次import的时候,会去加载源文件,# 同时生成了一个.pyc文件,当第二次甚至第三次再import的时候,将不再加载源文件,直接去加载.pyc文件】#import module01.moduleDemo01#1.导入模块,调用其中的函数或者访问其中的变量#格式:包名.模块名.函数() 或者 包名.模块名.变量module01.moduleDemo01.fun3()print(module01.moduleDemo01.num)#4.如果同时导入的多个模块中有重名的函数,调用函数的时候,可以通过函数所在的位置区分module01.moduleDemo01.fun1()module01.moduleDemo02.fun1()"""总结:1.模块的好处:提高代码的复用性,提高代码的可维护性2.通过import的方式导入,每次调用函数或者访问变量的时候都需要指明模块的路径,所以import多用来导入系统模块import os,random,math"""

1.2from-import 函数或者变量
1.3from-import *

代码演示:

moduleDemo01.py

def fun1():print("fun~~~~111")def fun2():print("fun~~~~222")def fun3():print("fun~~~~333")def fun4():print("fun~~~~444")num =10#fun1()#fun2()

moduleDemo02.py

def fun1():print("fun~~~~111~~~~")def fun2():print("fun~~~~222~~~~~")

moduleDemo03.py

def fun31():print("fun~~~~111")def fun32():print("fun~~~~222")def fun33():print("fun~~~~333")def fun34():print("fun~~~~444")

textDemo02.py

#from...import#语法:from 包名.模块名 import 函数名或者变量名或者类名#注意:从xxx导入xx#1.导入不同的函数或者变量或者类名,使用逗号隔开from module02.moduleDemo01 import fun1,fun2,numfrom module02.moduleDemo02 import fun1,fun2from module02.moduleDemo03 import *#2.通过from。。。import的方式导入模块之后,调用函数或者访问变量#格式:函数名()fun1()fun2()#3.如果没有指明哪个函数被导入,则相当于该函数未被定义#fun3()#3.通过form---import的方式导入模块,如果不同的模块中存在重名的函数,则后出现的会覆盖掉先出现的【就近原则】def fun1():print("hello")fun1()#4.如果一个模块中需要被导入的函数或者变量比较多的情况下,分别导入比较麻烦,可以使用from ... import *#select * from 表fun31()fun32()#5.要访问一个模块中的变量,也可以和函数一样使用【函数名就是一个变量名】num = 100print(num)"""导入自定义模块:import 包名.模块名.函数名(实参)from...import 函数名(实参)"""

2.name属性和dir函数

2.1name属性

__name__:如果指定的py文件作为模块的话,如果不想让其中的某些代码执行,则可以使用该属性进行屏蔽语法:if __name__ == "__main__":#不希望运行其他py文件时被执行的代码注意:每个模块都有一个__name__属性,代表了模块的名字,当他的值为__main__的时候,说明是当前模块在运行,反之,则表示是其他模块在运行,只是导入了当前模块

代码演示:

moduleDemo01.py

def fun1():print("fun~~~~111")def fun2():print("fun~~~~222")def fun3():print("fun~~~~333")num =10if __name__ == "__main__":def fun4():print("fun~~~~444")fun1()fun2()fun3()fun4()

textDemo03.py

from module03.moduleDemo01 import *fun1()fun2()#fun4()

2.2dir函数

代码演示:

import os,random#列出一个指定模块中的所有内容【函数,变量】,返回一个列表print(dir(os))

二、面向对象

1.面向对象的思想

1.1案例

万物皆对象

面向过程【process】和面向对象

举例说明:

案例一:我今天想吃大盘鸡

面向过程 面向对象

1.自己去买菜 1.委托一个人去帮忙买菜

2.自己择菜 2.委托一个人择菜

3.自己做菜 3.委托一个人做菜

4.自己吃 4.自己吃

案例二:小明是一个电脑小白,想要组装一台电脑

面向过程 面向对象

1.小明补习电脑知识 1.委托一个洞电脑知识的人去买零件

2.小明去买零件 2.委托一个动手能力强的人组装

3.小明组装 3.小明打游戏

4.小明打游戏

案例三:一辆白色的奥迪行驶在京藏高速上

1.2面向对象和面向过程的区别

面向过程

​ 在生活案例中:一种看待问题的思维方式,在思考问题的时候,侧重于问题是怎样一步一步解决的,然后亲力亲为的去解决问题

​ 在程序中:代码从上往下依次执行;程序流程在写程序的时候已经决定;顺序结构,分支结构,循环结构

面向对象:

​ 在生活案例中:一种看待问题的思维方式,在思考问题的时候,侧重于能够找到一个具有特殊功能的实体,然后委托该实体去帮忙完成某件事情

​ 在程序中:将多个具有特殊功能的实体集合到一起,形成一个类,其中某个具体的实体被称为对象;程序流程由需求决定

注意:面向对象的核心是类和对象

​ 使用面向对象进行开发,先要找到具有特殊功能的实体【对象】,如果有,则直接使用,如果没有,则可以创建

​ 面向对象只是一种编程思想,并不是一门编程语言

2.类和对象

2.1类和对象的概念

类:一个具有特殊功能的实体的集合【群体】

对象:在一个类中,一个具有特殊功能的实体,能够帮忙完成某件事情【对象也被称为实例】

两者之间的关系:类用于描述某一类对象的共同特征,而对象是类的具体的存在

问题:先有类,还是先有对象?

【在程序中,一般先定义类,然后再通过类创建对象】

举例:

​ 类 对象

​ 快递 圆通,中通,,,

​ 人

注意:类也是一种数据类型,只不过是自定义的,创建对象的过程其实就是定义类变量的过程

2.2类和对象的使用
a.类的定义

语法:

class 类名():

​ 类体

说明:

​ a.Python中通过关键字class定义类

​ b.类名:只要是一个合法的标识符即可,但是,尽量采用大驼峰命名

​ 举例:Iterator ValueError KeyError TypeError

​ c.():目前()是空的,也可以省略

​ d。通过缩进来体现类体的存在

​ e.类体一般由两部分组成:类的特征和类的行为

代码演示:

#类的定义class MyClass():pass#注意:在同一个py文件中可以同时定义多个类,但是,一般情况下,采用包的方式使用,一个类一个模块class MyClass1():pass

b.类的设计

事物名称:【类名】,人【Person】

事物的特征:【变量】,身高【height】,年龄【age】 ------>名词

事物的行为:【函数】,吃,跑-------》动词

3.类中的方法和属性

3.1定义

类单独存在没有任何意义,所以,定义类其实就是定义类中的成员【成员变量,成员方法】

成员变量:类中定义的变量,也被称为属性

成员方法:类中定义的方法

注意:如果多个对象具有相同的特性和行为,则可以抽取出来一个类【相同的属性和方法】

代码演示:

#一、定义类#1.事物的名称:类名class Person():#2.事物的特征:成员变量/属性name = "hello"age = 0height = 0.0#3.事物的行为:成员方法/成员函数"""1.区别于普通方法,类中的成员方法,参数部分一定有self,而且存在于形参列表的第一个2.调用成员函数,self不需要被手动传参3.self不是Python的关键字,可以是任意的标识符,为了结合其他编程语言的使用,习惯上使用self4.如果要给成员函数设置参数,则在self后面进行添加,如果没有参数,self也不能省略5.self:自己,代表类的实例【对象】"""def eat(self,food):print(id(self))print("eating" + food)def run(self):print("running")

3.2对象的创建【对象的实例化】

语法:对象名 = 类名()

注意:对象的创建过程其实就是对象实例化的过程,创建对象其实相当于定义了一个类的变量

num = 10

代码演示:

#二、对象的创建#实例化一个对象,p1也被为变量,引用,对象,# 严格意义上来说,p1不是一个对象,只是一个指向一个对象的引用p1 = Person()print(type(p1)) #<class '__main__.Person'>num = 10print(type(num)) #<class "int">print(id(p1))p2 = Person()print(id(p2))

3.3内存中的对象

扩展:内存分类

​ a.寄存器:最快的存储区,由编译器根据需求进行内存分配,我们在程序中无法控制

​ b.栈:存储对象的引用,但是对象本身不存储在栈中,存储在堆中

​ 特点:被执行完成之后,函数或者引用所占用的空间会立马被释放

​ c.堆:存储所有创建出来的对象

​ 特点:执行完不会立即被释放,当使用完成之后,会被标记上垃圾的标识,等待系统的垃圾回收机制回收【建议:当一个引用没有指向或者不确定该指向谁的时候,引用一般指向None】

​ d.方法区

​ 静态域:存放静态成员

​ 常量池:所有数据类型的常量

代码演示:

#三、内存中的对象num = 10 #num存储在栈中,10存储在堆中p3 = Person() #p3存储在栈中,Person()真正的对象存储在堆中

3.4成员变量和成员方法的使用

代码演示:

四、访问类中的成员变量和调用类中的成员方法#1.访问属性#语法:对象.属性名#赋值:对象.属性名 = 新值per1 = Person()print(per1.name)print(per1.age)print(per1.height)#赋值per1.name = "zhangsan"print(per1.name)#2.调用函数#语法;对象.函数(实参)#self:self不需要被手动传参,系统会自动传参,传的是当前的对象【谁调用该函数,其中的self代表的就是谁】per1.eat("apple")print(id(per1))#per2 = per1 #self = per1per1.run()

4.动态绑定属性和限制绑定

代码演示:

#1.动态绑定属性#对象可以任意访问一个类中没有被定义的属性class MyClass1():num1 = 10num2 = 20def fun1(self):print("1111")def fun2(self):print("2222")#创建对象c1 = MyClass1()print(c1.num1)print(c1.num2)c1.fun1()c1.fun2()c2 = MyClass1()c2.num3 = 100#注意:动态绑定属性的时候,只是绑定给了指定的对象,其他的对象都没有该属性print(c2.num3)#print(c1.num3) #AttributeError: 'MyClass1' object has no attribute 'num3'c1.num3 = 37print(c1.num3)#注意:动态绑定属性,只是绑定给了指定的对象,并没有绑定给类del c1.num3print(c2.num3)#2.限制绑定#__slots__class MyClass2():name = ""age = 0#限制属性:被限制绑定的属性通过字符串的名称保存在一个元组中__slots__ = ("num1","num2")m1 = MyClass2()m1.num1 = 32m1.num2 = 36print(m1.num1,m1.num2)m1.num3 = 66print(m1.num3) #AttributeError: 'MyClass2' object has no attribute 'num3'

综合案例一

代码演示:

practiceDemo01.py

#测试文件"""需求:开学了,王老师让小明,小花,小丽做自我介绍需要介绍姓名,年龄,爱好,一段才艺展示分析:老师类特征:姓名行为:让xx做自我介绍学生类:特征:姓名,年龄,爱好行为:一段才艺展示"""from practice01.teacher import Teacherfrom practice01.student import Student#1.创建一个老师的对象wang = Teacher()#给老师的对象的属性赋值wang.name = "王老师"#2.创建学生的对象xiaoming = Student()#给学生对象的属性赋值xiaoming.name = "小明"xiaoming.age = 18xiaoming.hobby = "吹牛逼"#3.让老师执行自己的行为wang.letStuIntroduce(xiaoming)xiaohua = Student()xiaohua.name = "小花"xiaohua.age = 18xiaohua.hobby = "唱歌"wang.letStuIntroduce(xiaohua)

teacher.py

#实体文件"""老师类特征:姓名行为:让xx做自我介绍"""class Teacher():#特征:姓名name = ""#行为:让xx做自我介绍#stu;传值的时候,需要传的是一个学生的对象def letStuIntroduce(self,stu):print(self.name + "让" + stu.name + "做自我介绍")#学生开始做自我介绍stu.introduce()#做才艺展示:不同的学生有不同的才艺展示if stu.name == "小花":stu.sing()elif stu.name == "小丽":stu.dance()else:stu.lie()"""xiaoming = Student()stu = xiaomingnum1 = 10num2 = num1"""

student.py

#实体文件"""学生类:特征:姓名,年龄,爱好行为:做自我介绍,一段才艺展示"""class Student():#特征:姓名,年龄,爱好name = ""age = 0hobby = ""#行为:做自我介绍,一段才艺展示def introduce(self):print("大家好,我是%s,年龄:%d,爱好:%s" % (self.name,self.age,self.hobby))def sing(self):print("娘子~啊哈")def dance(self):print("广场舞")def lie(self):print("吹牛逼")

6.构造函数和析构函数

6.1构造函数

构造函数也被称为构造器,当创建对象的时候第一个被自动调用的函数per = Person()语法:def __init__(self,arg1,arg2....):函数体说明:a.之前的写法中没有显式的定义一个构造函数,所以系统默认提供了一个无参的构造函数b.__init__是构造函数的函数名,是固定写法c.arg1,arg2....可以根据具体的需求自定义,但是,一般情况下,构造函数的形参和成员变量有关d.构造函数的作用:创建对象,给对象的成员变量赋值

代码演示:

#1.构造函数调用的时机class Check1():#成员变量num1 = 10s1 = ""#成员方法def func(self):print("func")#构造函数def __init__(self):print("hello")c1 = Check1()c1.func()c1.func()c1.func()"""【构造函数和成员函数之间的区别】1.成员函数的函数名可以自定义,但是,构造函数的函数名是固定的,就是__init__2.成员函数必须手动调用,但是。构造函数是在创建对象的过程中自动被调用的3.对于同一个对象而言,成员函数可以被调用多次,但是,构造函数只能被调用一次"""#2.给构造函数添加参数class Check2():#成员变量num1 = 10s1 = ""#成员方法def func(self):print("func")#构造函数"""def __init__(self,n,s):print("构造函数被指定了")def __init__(self):print("构造函数被指定了")"""#注意2:在Python中,一个类中的构造函数只能出现一个,为了满足不同的需求,可以使用不定长参数def __init__(self,*args):print("构造函数被执行了")#注意1:当在类中显式定义了构造函数,并且给构造函数设置了参数,则系统将不再提供无参的构造函数,# 所以创建对象的时候,类中的构造函数需要什么样的参数,则传相应的实参c2 = Check2(34,"abc")c21 = Check2()#3.构造函数的作用:给成员变量赋值class Check3():#成员变量num1 = 0s1 = ""#成员方法def func(self):print("func")#构造函数#构造函数的形参列表:一般和成员变量有关def __init__(self,n,s):#实例属性num1 = ns1 = sc3 = Check3(10,"he")print(c3.num1,c3.s1)print("*********")#4.self的使用class Check4():#成员变量#类属性:属于类num1 = 0s1 = ""#成员方法def func(self):print("func")#构造函数#构造函数的形参列表:一般和成员变量有关def __init__(self,num1,s1):#实例属性:属于对象#self的作用:通过self区分成员变量和局部变量self.num1 = num1self.s1 = s1c4 = Check4(10,"he")print(c4.num1,c4.s1)#5.使用了self之后,则可以省略类属性class Check5():#构造函数def __init__(self, num1, s1):#成员变量self.num1 = num1self.s1 = s1#成员方法def func(self):print("func")c5 = Check5(10,"abc")print(c5.num1,c5.s1)c5.num1 = 100c5.s1 = "hello"#总结:一般情况下,在一个类中,包含构造函数和成员函数,在构造函数中,定义成员变量,# 并给成员变量赋值,通过有参的构造函数赋值

综合案例二

practiceDemo02.py

#测试文件"""需求:富二代王思聪开着豪车玛莎拉蒂,很自豪的向他的新女友炫耀起来分析:富二代类特征;姓名行为:开车,炫耀汽车类:特征:品牌,颜色行为:行驶女友类特征:姓名"""from practice02.richman import RichManfrom practice02.car import Carfrom practice02.girlfriend import GirlFriend#1.创建富二代对象r = RichMan("王思聪")#2.创建女友对象g = GirlFriend("凤姐")#3.创建汽车的对象c = Car("五菱宏光","银白色")#4.让富二代执行自己的行为r.driveCar(c)r.show(g,c)

richman.py

"""富二代类特征;姓名行为:开车,炫耀"""class RichMan():def __init__(self,name):self.name = name#行为def driveCar(self,car):print("富二代%s开车他的豪车%s" % (self.name,car.brand))def show(self,gf,car):print("向%s炫耀豪车,你看,我这豪车%s,你瞅瞅这颜色%s" % (gf.name,car.brand,car.color))

girlfriend.py

"""女友类特征:姓名"""class GirlFriend():def __init__(self,name):self.name = name

car.py

"""汽车类:特征:品牌,颜色行为:行驶"""class Car():def __init__(self,brand,color):self.brand = brandself.color = colordef run(self):print("running")

如果觉得《自定义模块+python面向对象+综合案例》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。