python面向对象概念及练习题.pdf

上传人:白大夫 文档编号:5633574 上传时间:2020-07-10 格式:PDF 页数:31 大小:1.41MB
返回 下载 相关 举报
python面向对象概念及练习题.pdf_第1页
第1页 / 共31页
python面向对象概念及练习题.pdf_第2页
第2页 / 共31页
python面向对象概念及练习题.pdf_第3页
第3页 / 共31页
python面向对象概念及练习题.pdf_第4页
第4页 / 共31页
python面向对象概念及练习题.pdf_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《python面向对象概念及练习题.pdf》由会员分享,可在线阅读,更多相关《python面向对象概念及练习题.pdf(31页珍藏版)》请在三一文库上搜索。

1、. . 面向对象及练习题 1. 面向对象 1.1 面向对象概念 面向对象是一种编程思想,是对现实世界中的事物进行抽象的方式。应 用到代码编程设计中,是一种建立现实世界事物模型的方式。 1.2 面向对象和面向过程区别 面向过程关注的是完成工作的步骤, 面向对象关注的是 谁能完成工作。 面向对象是在完成工作的时候关注哪些个体能够完成对应的工作,找到对应 的个体即可完成对应任务。 2. 类 2.1 类的概念 类是一系列事物的统称,同类事物必定具有相同的特征。日常事物的特征根 据特性分为状态和行为,对应到类中是变量和方法。 特征分类: 状态变量(成员变量) 行为方法(成员方法) 统称: 类的成员 2.

2、2 类定义语法格式 class类名: pass . . 说明: pass 是空语句,不具有任何意义,仅为了保持程序结构完整性 2.3 类名的命名规则 类名命名规范:满足大驼峰命名规则 3. 对象 3.1 对象的概念 对象是类的具体表现形式, 是实际存在的个体。 (类是一系列事物的统称) 3.2 创建对象语法格式 对象名 = 类名() 3.3 注意事项 对象的创建不限制数量,一个类可以创建任意个数的对象 4. 成员变量 4.1 成员变量的概念 成员变量用于描述对象的固有状态或属性。 . . 4.2 定义成员变量语法格式(公有属性/公有变量) class 类名: def _init_(self):

3、 self.变量名 1 = 值 1 self.变量名 2 = None 4.3 成员变量定义语法格式(独有属性/独有变量) 对象名 . 变量名 = 值 4.4 公有变量与独有变量的区别 公有变量在 _init_ 方法中声明,每个对象都具有该变量 独有变量在创建对象后声明,只有当前对象具有此变量 定义对象的独有变量时,如果独有变量名与公有变量名相同,视为 修改公有变量的值;如果独有变量名与公有变量名不相同,视为定 义新的独有属性 None含义是为空,表示没有具体的数据 . . 4.5 变量的调用格式 取值:对象名 . 变量名 赋值:对象名 . 变量名 = 值 5. 成员方法 5.1 成员方法概念

4、 成员方法用于描述对象的固有行为 5.2 定义成员方法语法格式 格式一(无参方法): class 类名: def 方法名 (self): 方法体 格式二(有参方法) class 类名: def 方法名 (self,形参 1,形参 2,): 方法体 . . 5.3 调用成员方法语法格式 格式一(调用无参方法) : 对象名 . 方法名() 格式二(调用有参方法) : 对象名 . 方法名(实参 1,实参 2,) 6. _init_ 方法 6.1_init_ 方法的作用 _init_ 方法,也称为构造方法,创建对象时为对象初始化成员变量 6.2 定义_init_方法语法格式 格式一: def _ini

5、t_(self): self.变量名 1 = 值 1 . . 格式二: def _init_(self,形参 1,形参 2,): self._ 属性名 1 = 形参 1 self._ 属性名 2 = 形参 2 6.3_init_ 方法调用和执行 _init_ 方法在 创建对象 时被运行,无需手工调用即可执行 _init_ 方法中如果 有形参 ,在创建对象时需要传递对应的实参 6.4 魔术方法 魔术方法 是在类中声明、 定义的方法, 执行时无需手工调用, 自动执行。 7. _str_方法 7.1_str_ 方法的作用 _str_ 方法是在使用 print函数打印输出对象到屏幕时被调用的方法, 用

6、于返回对象的规范化字符串表现形式 7.2 定义_str_方法语法格式 def _str_(self): return 打印对象是显示的信息 . . 8. 成员方法调用类成员 8.1 成员方法中调用成员变量语法格式 self.变量名 8.2 成员方法中调用成员方法语法格式 self.方法名 ( 实参 1,实参 2,) . . 8.3 self self仅出现在成员方法中,指代执行该方法的对象。 9.封装 9.1 封装的作用 封装操作可以对受访问保护的成员进行功能开放的控制,达到保护数据 不被非法访问的目的 9.2 定义私有变量语法格式 self._属性名 = 值 9.3 定义私有方法语法格式 d

7、ef _方法名 (self ,形参 1,形参 2,): . . 方法体 9.4 标准封装语法格式 变量私有化格式: self._属性名 = 值 提供公共的访问器格式: def get_属性名 (self): return self._属性名 提供公共的修改器格式: def set_ 属性名 (self,属性名 ): self._ 属性名 = 属性名 10. 类变量 10.1 类变量的概念 类变量是定义在类中,不属于某个具体对象的特征,被所有对象共同使 用的特征 . . 10.2 定义类变量语法格式 class 类名: 变量名 = 值 10.3 调用类变量语法格式 赋值格式: 类名. 类变量名

8、= 值 取值格式: 类名. 类变量名( 推荐) 对象名 . 类变量名(不推荐) 10.4 注意事项 类变量推荐使用类名取值访问,也可以使用对象名取值访问 类变量 只能通过类名修改;使用对象名调用类变量修改类变量的值 时会创建新的对象独有变量;如果此时对象具有同名对象变量,则 修改对应的变量值 类变量可以私有化 11. 类方法 11.1 类方法的概念 类方法是定义在类中,不属于某个具体对象的行为,被所有对象共同使 用的行为 11.2 定义类方法基本语法 class 类名: classmethod def 方法名 (cls , 形参 1,形参 2,): 方法体 . . 11.3 调用类方法语法格式

9、 类名. 类方法名 ( 实参 1,实参 2,) (推荐) 对象名 . 类方法名 (实参 1,实参 2,) (不推荐) 11.4 注意事项 类方法中 不允许 使用实例变量和实例方法 类方法中 允许使用类变量和类方法,通过第一个参数cls 进行 实例方法中 允许使用类变量和类方法 12. 静态方法 12.1 定义静态方法语法格式 class 类名: staticmethod def 方法名 ( 形参 1, 形参 2,): 方法体 . . 12.2 调用静态方法语法格式 类名. 静态方法名 (实参 1,实参 2,) (推荐) 对象名 . 静态方法名 ( 实参 1,实参 2,) (不推荐) 12.3

10、各种方法定义规则 只访问成员变量的方法,定义成实例方法 只访问类变量的方法,定义类方法 既访问成员变量,也访问类变量的方法,定义成实例方法 既不访问成员变量,也不访问类变量,定义成静态方法 . . 练习题 1 概念理解 要求: 1.如何理解面向对象编程 (OOP) 2.什么是类,什么是对象 提示: 1.类和对象有两个层面的含义: 类是对一类具体的事物的抽象的概括,具有 相似内部状态和运动规律的实体的集合,具有相同属性和行为事物的统称,是抽 象的;对象是一个具体的事物, 在现实世界中可以是看得见摸得着的,可以直接 使用的 2.拥有相同 (或者类似 )属性和行为的对象都可以抽像出一个类 练习题 2

11、 定义类、创建对象 要求: 1.python 中如何定义一个类 class 类名: 方法. classTest: def test(self): pass 2.类(class)由哪三个部分构成 类的名称、类的属性、类的方法 3.类名的命名规则是什么 大驼峰命名法 4.python 中如何通过类创建对象,请用代码进行说明 # 创建对象 # 对象名 = 类名() . . classHuman: # 定义类 pass man = Human() # 创建对象 5.如何在类中定义一个方法,请用代码进行说明 classHuman: # 定义 run 方法 def run(self): print(“正在

12、奔跑 “) 6.定义一个 People 类,使用 People 类,创建一个 mayun 对象后,添加 company 属性,值是 “阿里巴巴 “;创建一个 wangjianling 对象,添加 company 属性,值是 “万达集团 “ classPeople : pass mayun = People() # 创建 mayun对象 pany = “阿里巴巴 “# 为对象添加属性 wangjianlin = People () # 创建 wangjianlin 对象 pany= “万达集团 “ 7.定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象 并分别添加上颜色属性 cla

13、ssFruit: pass apple = Fruit() apple.color = “红色“ orange = Fruit() orange .color = “橙色 “ watermelon = Fruit() watermelon = “绿色“ 8.定义一个汽车类,并在类中定义一个 move 方法, 然后分别创建 BMW_X9 、 AUDI_A9 对象,并添加颜色、马力、型号等属性,然后分别打印出属性值、调 用 move 方法 classCar: def move(self): print(“汽车正在移动 “) BMW_X9 = Car() BMW_X9 .color = “白色 “

14、BMW_X9 .horsepower = “300“ . . BMW_X9 .model = “X9“ BMW_X9 .move() print(“这辆%s %s的马力是 %s匹 “%(BMW_X9 .color,BMW_X9 .model,BMW_X9 .horsepower ) AUDI_A9 = Car() AUDI_A9 .color = “黑色 “ AUDI_A9 .horsepower = “320“ AUDI_A9 .model = “A9“ AUDI_A9 .move() print(“这辆%s %s的马力是 %s匹“%(AUDI_A9 .color, AUDI_A9 .mod

15、el, AUDI_A9 .horsepower ) 提示: 1.可以在通过类创建出对象后,再为对象添加属性:对象名 .属性名 = 值 的 方式添加 2.调用对象的方法和调用普通函数的一样,使用()来实现调用,只不过调用 方法需要使用:对象名 .方法名 ()来进行调用 练习题 3 要求: _init_ 方法、 _str_ 方法、 self 1._init_ 方法有什么作用,如何定义 当使用类名 ()的方法去创建对象的时候 python 解释器会自动调用 _init_方法 因此可以在 _init_方法中做一些初始化的设定 在每次创建新对象时,都自动完成这些初始化的设定 classHuman: de

16、f _init_(self): # 注意名字不能写错,否则就只是一个普通的方法 pass 2._str_ 方法有什么作用,使用时应注意什么问题 如果类中定义了 _str_方法,那么当使用print 打印对象时,打印出的信息是 _str_方法的返回值 注意点: _str_方法必须有返回值,且必须返回一个字符串类型的值 3.方法中的 “self“代表什么 . . 类中定义的许多方法,除了之后会提到的类方法和静态方法以外,其他任何的 方法 当被对象调用时, python 解释器都会把这个对象作为这个方法的第一个参数传 入 所以定义这些方法时,必须写上第一个参数,往往写成self 去接收 因此在这些方

17、法中, self 就可以直接被当做当前对象来使用 4.在类中定义 _init_ 和_str_ 方法时,必须提供形参吗,第一个形参又必 须是 self 吗?为什么? 同上 但这个参数名可以写成别的,但往往写成self,便于编写程序的人区分 提示: 1._init_ 方法可以在创建对象时,为对象实现一些初始化的操作,提供一 些默认属性 2._str_ 方法可以在使用 print 打印对象时,打印出 _str_ 方法的返回值 3._str_ 方法必须拥有返回值,并且返回值的数据类型格式只能是字符串 类型 练习题 4 判断以下说法是否正确,并说明理由 要求: 1.类就好比一个模型, 可以预先定义一些统

18、一的属性或者方法,然后通过这 个模型创建出具体的对象 True 2.类是抽象的,而对象是具体的、实实在在的一个事物 True 3.拥有相同 (或者类似 )属性和行为的对象都可以抽像出一个类 True 4.一个类只能创建出一个对象 False 通过类可以创建无数个不同的对象 例外:使用了单例模式的,只会创建出一个对象(就业班课程会讲解单例模式) . . 5._init_ 方法在创建对象时,可以完成一些初始化的操作,完成一些默认 的设定 True 6.类是抽象的,而对象是具体的、实实在在的一个事物 True 7._str_ 方法可以没有返回值 False 必须有返回值 8._str_ 方法可以返回

19、除字符串以外的其他类型的数据 False 必须返回字符串类型的数据 练习题 1 面向对象应用 1 要求: 1.任意定义一个动物类 2.使用_init_ 方法,在创建某个动物对象时,为其添加name 、age、 color,food 等属性,如 “ 熊猫” ,5, “黑白” ,66,“ 竹子” 3.为动物类定义一个run 方法,调用 run 方法时打印相关信息, 如打印出 “ 熊 猫正在奔跑 ” 4.为动物类定义一个get_age 方法,调用 get_age 方法时打印相关信息, 如打印出 “ 这只熊猫今年 5 岁了” 5.为动物类定义一个eat 方法,调用 eat 方法时打印相关信息, 如打印

20、出 “ 熊 猫正在吃竹子 ” 6.通过动物类分别创建出3 只不同种类的动物, 分别调用它们的方法, 让他 们“ 跑起来 ” ,“ 吃起来 ” classAnimal: def _init_(self, name, age, color, food): self.name = name# 为对象设置 name属性 self.age = age# 为对象设置 age属性 self.color = color# 为对象设置 color 属性 self.food = food# 为对象设置 food 属性 # run方法 def run(self): . . print(“%s 正在奔跑 .“%sel

21、f.name ) # 打印年龄的方法 def get_age (self): print(“这只%s今年%s“%(self.name, str(self.age) # 吃方法 def eat(self): print(“%s 正在吃 %s“%(self.name, self.food) # 猫 catTom = Animal(“Tom“, 3, “gray“, “fish“ ) # 老鼠 mouseJerry = Animal(“Jerry“, 3, “brown“, “奶酪 “) # 狗 watchdog = Animal(“旺财“, 2, “white“ , “meat“) tom_cat

22、.run() tom_cat.get_age () tom_cat.eat() . . 额外知识 函数 在学习函数之前 , 首先要明白为什么要学习函数? 学习了函数 , 能提高我们的工作效率 , 编程语言里面 , 离不开函数 提高效率体现在哪里 ? 函数可以封装一段代码 , 只需要我们定义一次 , 就可以做到多次使用了 . 函数是用来干什么的 ? 每一个函数都有对应的意义, 我们定义函数 , 都是为了实现某种单一的功能, 也就 是说, 函数就是为了实现某种功能, 实现某些需求的 9. 定义函数 那我们如何定义函数 ? . . 当我们调用say_hello这个函数的时候 , 我们能看到这样的一句

23、打印输出, 这就 说明这个函数被调用了 . 任何一个函数 , 必须要做到先定义 ( 先声明 ), 后调用 如果我们将调用提前 , 我们会看到 : 为什么 ? 因为咱们 python 是一门解释性语言 , 代码是从上到下一行一行执行的, 所以当代 码运行到第一行的时候 , 我们调用say_hello()的时候 , 并没有对应的方法 , 这就 好比: 我们把 say_hello()当做一个做饭的功能, 我们只有先做饭 , 才能吃饭 , 先 . . 有做饭这个功能 , 我们才能做饭 . 10.函数的复用性 下面说一下函数参数的使用, 那么, 在说参数之前 , 我们先了解一下 函数的复用性 , 使用函

24、数到 底好在哪里 ? 比如我有这么一个需求 , 我想遍历一个 1-100 之间所有的数 , 这很简单 i = 0 while i =100: print i i+=1 这样我就能获取 1-100 之间所有的数 我们将这一段代码封装到一个函数里面去, 这样我们就很方便的能够在任何地方 打印 1-100 之间所有的数了 . . 如果我们想在其他的页面也打印这个1-100 之间所有的数 , 那我们还用写这个代 码么? 答案是肯定不需要再写这么多行代码了 1. 确定这个函数的包名 , 我取的名字是 utils 2. 导包 3.我们来看一下控制台能不能获取到1-100 之间所有的数 . . 也是可以的

25、, 所以说, 这个函数封装了我们一段代码, 实现了打印 1-100 之间所有 的数 那我们在工作中 , 实际上一个大的项目是有很多重复的功能的, 比如联网的操作 , 我们不可能每次都这样一行行的写代码, 所以 , 我们把它封装到一个函数里面, 下 次想联网获取直接调用我们写好的函数就行了, 这就是函数的好处 , 复用性 , 这就 是函数的可多次调用 . 11.函数的参数 言归正传 , 我们来说说函数参数的使用 刚刚我们已经能够获取到1-100 之间所有的数了 , 但是我们现在改需求了 , 我们 希望能够获取 100-200 之间的所有的数 , 这个怎么办呢 ? 这个也很简单 我们再定义一个函数

26、traverse1(),初始值改成 100, 当满足小于等于 200 的情况 . . 打印就行了 ok, 没问题 , 那我现在再改需求了 , 我希望打印出200 到 400 之间所有的数 , 怎么 办? 也很简单 : 那我如果再改需求 , 我想打印10-50 之间的所有数 , 我是不是又要定义一种方法 traverse3()? 显然, 我们发现 , 其实这几个函数 , 相似的地方还是挺多的我们仅仅只是改变了i 的初始值 , 以及 while i = 多少的一个值而已 , 这样的代码 , 显然是过于死板的 , 我们需要把这个代码写活, 这里, 我们就用到了参数了 实际上 , 如果我们 i 的初始

27、值和我们循环的条件i= 多少的值要是能随心所欲的 根据我们自己的需求变化就好了, 所以这里 , 我定义了两个变量 , 一个是 m 一个是 n,m 表示循环的初始值 ,n 表示你 循环的终止值 , 也就是 i=n 我们循环的条件 . . 如果我们想遍历 100-200 之间的所有数 , 那我们传进来 100,200 就能够代替这个 m,n 的值就好了 , 这里, 咋们函数提供了这样的一种方式 我们把 100 这个值传给了 m,200 这个值传给了 n 那么 i = 100 while i = 200: 我们就能打印出 100 到 200 之间所有的数了 , . . 现在, 我希望打印 200-3

28、00 之间的数 , 就可以直接使用就行了 一行代码就搞定了 , 所以说 , 有参数的函数是灵活的 那么参数又分为形参和实参: 在函数上定义的参数只是一个占位符, 被称为形式参数 , 简称形参 在调用时传入的参数是具体的内容, 被称为实际参数 , 简称实参 m和 n 仅仅只是一个占位而已, 我们如果不传值进来, 是没有任何的意义的 这就是函数的参数的使用 12.函数的返回值 再来说说函数的返回值 比如我们有这么的一个需求: 求 1-100 之间的和 : 也非常简单 , . . 我们看一下控制台输出的结果:5050 好了, 现在我们还要一个需求 , 我们希望能求出1-100 之间所有数的平均值 (

29、 这里 提示一下 ,1-100 之间有 100个数 我们可以用 100 - 1 + 1的方式表示 ) 这个怎么做呢 ? . . 如果我们把这个求平均值的代码放traverse()函数里面合理吗 ? 目前来说好像要求达到了, 但是我们在回过头来看看, 如果我们继续想要遍历 m-n 之间所有的数 , 次函数还能用吗 ?显然是不能的 , 因为这个函数已经被我们改 变了功能 , 他是求 m-n 之间所有数的平均值 那我们前面那么多的地方, 都引用到了打印m-n 之间所有的数 , 现在却变成了求 平均值了 , 这样合理吗 ? 显然是不合理的 所以, 函数的功能必须是独立的, 也就是说 , 我们还需要定义

30、一个求平均值的函 数 求 1-100 之间所有数的平均值 , 现在 1-100 的 m,n的值我都知道 , 但是 sum的值我 知道吗 ? . . 看看控制台的输出 我们希望拿到traverse(1, 100)的结果 sum才行, 但是在函数里面 , 我们能打印 出 sum的值为 5050, 但是在函数外面 , 我们能拿到这个 sum值吗?我们试试 : 看看控制台的输出 : . . 我们得到的结果是None,表示我们没有拿到这个sum值 那么怎么才能拿到函数里面的结果呢? 这就需要我们使用return 返回值了 , 我们需要将 sum值返回出来 如何使用 ? 加一个 return即可: 我们来看看控制台的输出: . . 也就是说 , 我们现在使用了return之后, 就能够拿到函数里面传给我的值了, 那 我们继续执行求平均值的操作, 这样就简单了 调用此函数即可 那如果要打印 100-200 之间所有数的和呢 ? 同样的 , 仅仅改变一下实参即可 我们看看控制台的打印输出: 得到的结果 150

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1