python面向对象概念及练习题Word格式.docx
- 文档编号:17407193
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:16
- 大小:23.50KB
python面向对象概念及练习题Word格式.docx
《python面向对象概念及练习题Word格式.docx》由会员分享,可在线阅读,更多相关《python面向对象概念及练习题Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
class类名:
def__init__(self):
self.变量名1=值1
self.变量名2=None
成员变量定义语法格式(独有属性/独有变量)
对象名.变量名=值
公有变量与独有变量的区别
公有变量在__init__方法中声明,每个对象都具有该变量
独有变量在创建对象后声明,只有当前对象具有此变量
定义对象的独有变量时,如果独有变量名与公有变量名相同,视为修改公有变量的值;
如果独有变量名与公有变量名不相同,视为定义新的独有属性
None含义是为空,表示没有具体的数据
变量的调用格式
取值:
对象名.变量名
赋值:
对象名.变量名=值
5.成员方法
成员方法概念
成员方法用于描述对象的固有行为
定义成员方法语法格式
格式一(无参方法):
def方法名(self):
方法体
格式二(有参方法)
class类名:
def方法名(self,形参1,形参2,…):
调用成员方法语法格式
格式一(调用无参方法):
对象名.方法名()
格式二(调用有参方法):
对象名.方法名(实参1,实参2,…)
6.__init__方法
方法的作用
__init__方法,也称为构造方法,创建对象时为对象初始化成员变量
定义__init__方法语法格式
格式一:
def__init__(self):
self.变量名1=值1
格式二:
def__init__(self,形参1,形参2,…):
属性名1=形参1
属性名2=形参2
方法调用和执行
__init__方法在创建对象时被运行,无需手工调用即可执行
__init__方法中如果有形参,在创建对象时需要传递对应的实参
魔术方法
魔术方法是在类中声明、定义的方法,执行时无需手工调用,自动执行。
7.__str__方法
__str__方法是在使用print函数打印输出对象到屏幕时被调用的方法,用于返回对象的规范化字符串表现形式
定义__str__方法语法格式
def__str__(self):
return打印对象是显示的信息
8.成员方法调用类成员
成员方法中调用成员变量语法格式
self.变量名
成员方法中调用成员方法语法格式
self.方法名(实参1,实参2,…)
self
self仅出现在成员方法中,指代执行该方法的对象。
9.封装
封装的作用
封装操作可以对受访问保护的成员进行功能开放的控制,达到保护数据不被非法访问的目的
定义私有变量语法格式
属性名=值
定义私有方法语法格式
def__方法名(self,形参1,形参2,…):
方法体
标准封装语法格式
变量私有化格式:
属性名=值
提供公共的访问器格式:
defget_属性名(self):
return属性名
提供公共的修改器格式:
defset_属性名(self,属性名):
属性名=属性名
10.类变量
类变量的概念
类变量是定义在类中,不属于某个具体对象的特征,被所有对象共同使用的特征
定义类变量语法格式
变量名=值
调用类变量语法格式
赋值格式:
类名.类变量名=值
取值格式:
类名.类变量名(推荐)
对象名.类变量名(不推荐)
注意事项
类变量推荐使用类名取值访问,也可以使用对象名取值访问
类变量只能通过类名修改;
使用对象名调用类变量修改类变量的值时会创建新的对象独有变量;
如果此时对象具有同名对象变量,则修改对应的变量值
类变量可以私有化
11.类方法
类方法的概念
类方法是定义在类中,不属于某个具体对象的行为,被所有对象共同使用的行为
定义类方法基本语法
@classmethod
def方法名(cls,形参1,形参2,…):
方法体
调用类方法语法格式
类名.类方法名(实参1,实参2,…)(推荐)
对象名.类方法名(实参1,实参2,…)(不推荐)
类方法中不允许使用实例变量和实例方法
类方法中允许使用类变量和类方法,通过第一个参数cls进行
实例方法中允许使用类变量和类方法
12.静态方法
定义静态方法语法格式
@staticmethod
def方法名(形参1,形参2,…):
调用静态方法语法格式
类名.静态方法名(实参1,实参2,…)(推荐)
对象名.静态方法名(实参1,实参2,…)(不推荐)
各种方法定义规则
只访问成员变量的方法,定义成实例方法
只访问类变量的方法,定义类方法
既访问成员变量,也访问类变量的方法,定义成实例方法
既不访问成员变量,也不访问类变量,定义成静态方法
练习题1
概念理解
要求:
1.如何理解面向对象编程(OOP)
2.什么是类,什么是对象
提示:
1.类和对象有两个层面的含义:
类是对一类具体的事物的抽象的概括,具有相似内部状态和运动规律的实体的集合,具有相同属性和行为事物的统称,是抽象的;
对象是一个具体的事物,在现实世界中可以是看得见摸得着的,可以直接使用的
2.拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
练习题2
定义类、创建对象
1.python中如何定义一个类
class类名:
?
方法...
?
classTest:
deftest(self):
pass
2.类(class)由哪三个部分构成
类的名称、类的属性、类的方法
3.类名的命名规则是什么
大驼峰命名法
4.python中如何通过类创建对象,请用代码进行说明
#创建对象
#对象名=类名()
classHuman:
#定义类
man=Human()?
5.如何在类中定义一个方法,请用代码进行说明
#定义run方法
defrun(self):
print("
正在奔跑"
)
6.定义一个People类,使用People类,创建一个mayun对象后,添加company属性,值是"
阿里巴巴"
;
创建一个wangjianling对象,添加company属性,值是"
万达集团"
classPeople:
mayun=People()?
#创建mayun对象
="
#为对象添加属性
wangjianlin=People()?
#创建wangjianlin对象
7.定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性
classFruit:
apple=Fruit()
红色"
orange=Fruit()
橙色"
watermelon=Fruit()
watermelon="
绿色"
8.定义一个汽车类,并在类中定义一个move方法,然后分别创建BMW_X9、AUDI_A9对象,并添加颜色、马力、型号等属性,然后分别打印出属性值、调用move方法
classCar:
defmove(self):
汽车正在移动"
BMW_X9=Car()
白色"
300"
X9"
()
这辆%s%s的马力是%s匹"
%,,)
AUDI_A9=Car()
黑色"
320"
A9"
%,,)
1.可以在通过类创建出对象后,再为对象添加属性:
对象名.属性名=值的方式添加
2.调用对象的方法和调用普通函数的一样,使用()来实现调用,只不过调用方法需要使用:
对象名.方法名()来进行调用
练习题3
__init__方法、__str__方法、self
1.__init__方法有什么作用,如何定义
当使用类名()的方法去创建对象的时候
python解释器会自动调用__init__方法
因此可以在__init__方法中做一些初始化的设定
在每次创建新对象时,都自动完成这些初始化的设定
def__init__(self):
#注意名字不能写错,否则就只是一个普通的方法
2.__str__方法有什么作用,使用时应注意什么问题
如果类中定义了__str__方法,那么当使用print打印对象时,打印出的信息是
__str__方法的返回值
注意点:
__str__方法必须有返回值,且必须返回一个字符串类型的值
3.方法中的"
self"
代表什么
类中定义的许多方法,除了之后会提到的类方法和静态方法以外,其他任何的方法
当被对象调用时,python解释器都会把这个对象作为这个方法的第一个参数传入
所以定义这些方法时,必须写上第一个参数,往往写成self去接收
因此在这些方法中,self就可以直接被当做当前对象来使用
4.在类中定义__init__和__str__方法时,必须提供形参吗,第一个形参又必须是self吗为什么
同上
但这个参数名可以写成别的,但往往写成self,便于编写程序的人区分
1.__init__方法可以在创建对象时,为对象实现一些初始化的操作,提供一些默认属性
2.__str__方法可以在使用print打印对象时,打印出__str__方法的返回值
3.__str__方法必须拥有返回值,并且返回值的数据类型格式只能是字符串类型
练习题4
判断以下说法是否正确,并说明理由
1.类就好比一个模型,可以预先定义一些统一的属性或者方法,然后通过这个模型创建出具体的对象
True
2.类是抽象的,而对象是具体的、实实在在的一个事物
3.拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
4.一个类只能创建出一个对象
False
通过类可以创建无数个不同的对象
例外:
使用了单例模式的,只会创建出一个对象(就业班课程会讲解单例模式)
5.__init__方法在创建对象时,可以完成一些初始化的操作,完成一些默认的设定
6.类是抽象的,而对象是具体的、实实在在的一个事物
7.__str__方法可以没有返回值
必须有返回值
8.__str__方法可以返回除字符串以外的其他类型的数据
必须返回字符串类型的数据
面向对象应用1
1.任意定义一个动物类
2.使用__init__方法,在创建某个动物对象时,为其添加name、age、color,food等属性,如“熊猫”,5,“黑白”,66,“竹子”
3.为动物类定义一个run方法,调用run方法时打印相关信息,如打印出“熊猫正在奔跑”
4.为动物类定义一个get_age方法,调用get_age方法时打印相关信息,如打印出“这只熊猫今年5岁了”
5.为动物类定义一个eat方法,调用eat方法时打印相关信息,如打印出“熊猫正在吃竹子”
6.通过动物类分别创建出3只不同种类的动物,分别调用它们的方法,让他们“跑起来”,“吃起来”
classAnimal:
def__init__(self,name,age,color,food):
=name?
#为对象设置name属性
=age?
#为对象设置age属性
=color?
#为对象设置color属性
=food?
#为对象设置food属性
#run方法
%s正在奔跑..."
%
#打印年龄的方法
defget_age(self):
这只%s今年%s"
%,str))
#吃方法
defeat(self):
%s正在吃%s"
%,)
#猫
catTom=Animal("
Tom"
3,"
gray"
"
fish"
#老鼠
mouseJerry=Animal("
Jerry"
brown"
奶酪"
#狗
watchdog=Animal("
旺财"
2,"
white"
meat"
......
额外知识
函数
在学习函数之前,首先要明白为什么要学习函数
学习了函数,能提高我们的工作效率,编程语言里面,离不开函数
提高效率体现在哪里
函数可以封装一段代码,只需要我们定义一次,就可以做到多次使用了.
函数是用来干什么的
每一个函数都有对应的意义,我们定义函数,都是为了实现某种单一的功能,也就是说,函数就是为了实现某种功能,实现某些需求的
9.定义函数
那我们如何定义函数
当我们调用say_hello这个函数的时候,我们能看到这样的一句打印输出,这就说明这个函数被调用了.
任何一个函数,必须要做到先定义(先声明),后调用
如果我们将调用提前,我们会看到:
为什么
因为咱们python是一门解释性语言,代码是从上到下一行一行执行的,所以当代码运行到第一行的时候,我们调用say_hello()的时候,并没有对应的方法,这就好比:
我们把say_hello()当做一个做饭的功能,我们只有先做饭,才能吃饭,先有做饭这个功能,我们才能做饭.
10.函数的复用性
下面说一下函数参数的使用,那么,在说参数之前,我们先了解一下函数的复用性,使用函数到底好在哪里
比如我有这么一个需求,我想遍历一个1-100之间所有的数,
这很简单
i=0
whilei<
=100:
printi
i+=1
这样我就能获取1-100之间所有的数
我们将这一段代码封装到一个函数里面去,这样我们就很方便的能够在任何地方打印1-100之间所有的数了
如果我们想在其他的页面也打印这个1-100之间所有的数,那我们还用写这个代码么
答案是肯定不需要再写这么多行代码了
1.确定这个函数的包名,我取的名字是utils
2.导包
3.我们来看一下控制台能不能获取到1-100之间所有的数
也是可以的,所以说,这个函数封装了我们一段代码,实现了打印1-100之间所有的数
那我们在工作中,实际上一个大的项目是有很多重复的功能的,比如联网的操作,我们不可能每次都这样一行行的写代码,所以,我们把它封装到一个函数里面,下次想联网获取直接调用我们写好的函数就行了,这就是函数的好处,复用性,这就是函数的可多次调用.
11.函数的参数
言归正传,我们来说说函数参数的使用
刚刚我们已经能够获取到1-100之间所有的数了,但是我们现在改需求了,我们希望能够获取100-200之间的所有的数,这个怎么办呢
这个也很简单
我们再定义一个函数traverse1(),初始值改成100,当满足小于等于200的情况打印就行了
ok,没问题,那我现在再改需求了,我希望打印出200到400之间所有的数,怎么办
也很简单:
那我如果再改需求,我想打印10-50之间的所有数,我是不是又要定义一种方法traverse3()
显然,我们发现,其实这几个函数,相似的地方还是挺多的我们仅仅只是改变了i的初始值,以及whilei<
=多少的一个值而已,这样的代码,显然是过于死板的,我们需要把这个代码写活,这里,我们就用到了参数了
实际上,如果我们i的初始值和我们循环的条件i<
=多少的值要是能随心所欲的根据我们自己的需求变化就好了,
所以这里,我定义了两个变量,一个是m一个是n,m表示循环的初始值,n表示你循环的终止值,也就是i<
=n我们循环的条件
如果我们想遍历100-200之间的所有数,那我们传进来100,200就能够代替这个m,n的值就好了,这里,咋们函数提供了这样的一种方式
我们把100这个值传给了m,200这个值传给了n
那么i=100
=200:
我们就能打印出100到200之间所有的数了,
现在,我希望打印200-300之间的数,就可以直接使用就行了
一行代码就搞定了,所以说,有参数的函数是灵活的
那么参数又分为形参和实参:
在函数上定义的参数只是一个占位符,被称为形式参数,简称形参
在调用时传入的参数是具体的内容,被称为实际参数,简称实参
m和n仅仅只是一个占位而已,我们如果不传值进来,是没有任何的意义的
这就是函数的参数的使用
12.函数的返回值
再来说说函数的返回值
比如我们有这么的一个需求:
求1-100之间的和:
也非常简单,
我们看一下控制台输出的结果:
5050
好了,现在我们还要一个需求,我们希望能求出1-100之间所有数的平均值(这里提示一下,1-100之间有100个数我们可以用100-1+1的方式表示)
这个怎么做呢
如果我们把这个求平均值的代码放traverse()函数里面合理吗
目前来说好像要求达到了,但是我们在回过头来看看,如果我们继续想要遍历m-n之间所有的数,次函数还能用吗显然是不能的,因为这个函数已经被我们改变了功能,他是求m-n之间所有数的平均值
那我们前面那么多的地方,都引用到了打印m-n之间所有的数,现在却变成了求平均值了,这样合理吗
显然是不合理的
所以,函数的功能必须是独立的,也就是说,我们还需要定义一个求平均值的函数
求1-100之间所有数的平均值,现在1-100的m,n的值我都知道,但是sum的值我知道吗
看看控制台的输出
我们希望拿到traverse(1,100)的结果sum才行,但是在函数里面,我们能打印出sum的值为5050,但是在函数外面,我们能拿到这个sum值吗我们试试:
看看控制台的输出:
我们得到的结果是None,表示我们没有拿到这个sum值
那么怎么才能拿到函数里面的结果呢
这就需要我们使用return返回值了,我们需要将sum值返回出来
如何使用
加一个return即可:
我们来看看控制台的输出:
也就是说,我们现在使用了return之后,就能够拿到函数里面传给我的值了,那我们继续执行求平均值的操作,这样就简单了
调用此函数即可
那如果要打印100-200之间所有数的和呢
同样的,仅仅改变一下实参即可
我们看看控制台的打印输出:
得到的结果150
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python 面向 对象 概念 练习题