《Python语言程序设计》王恺 王志 机械工业出版社 第四章 面向对象 课后习题答案

4.5 课后习题
(1)类和对象的关系即数据类型与变量的关系,类规定了可以用于存储什么数据,而对象用于实际存储数据,每个对象可存储不同的数据

(2)类中包含属性和方法。属性对应一个类可用来保存哪些数据,而方法对应一个类可以支持哪些操作(即数据处理)

(3)私有属性,是指在类内可以直接访问,而在类外无法直接访问的属性

(4)构造方法是Python类中的内置方法之一,它的方法名为_init_,在创建一个类对象时会自动执行,负责完成新创建对象的初始化工作

(5)析构方法是类的另一个内置方法,它的方法名为_del_,在销毁一个类对象时会自动执行,负责完成待销毁对象的资源清理工作,如关闭文件等

(6)_str_方法的返回值必须是字符串

(7)通过继承,可以基于已有类创建新的类,新类除了继承已有类的所有属性和方法,还可以根据需要增加新的属性和方法

(8)通过多态,可以使得在执行同一条语句时,能够根据实际使用的对象类型决定调用哪个方法

(9)如果一个类C1通过继承已有类C而创建,则将C1称作子类,将C称作基类、父类或超类

(10)如果一个子类只有—个父类,则将这种继承关系称为单继承;如果一个子类有两个或更多父类,则将这种继承关系称为多重继承

(11)方法重写是指子类可以对从父类中继承过来的方法进行重新定义,从而使得子类对象可以表现出与父类对象不同的行为

(12)内置函数isinstance用于判断一个对象所属的类是否是指定类或指定类的子类

(13)内置函数issubclass用于判断一个类是否是另一个类的子类

(14)内置函数type用于获取一个对象所属的类

(15)Python提供了_slots_变量以限制可动态扩展的属性 

(16)Python提供了@property装饰器,可以将类中属性的访问和赋值操作自动转为方法调用,这样可以在方法中对属性值的取值范围做一些条件限定

(17)直接使用@property 可以定义一个用于获取属性值的方法(即getter)。如果需要对属性score定义一个设置属性值的方法(setter),需要用到的装饰器为@属性名.setter

(18)元类可以看成创建类时所使用的模板,也可以理解为用于创建类的类

(19)单例模式是指在程序运行时确保某个类最多只有一个实例对象

(20)在执行_init_前,还会执行类的一个内置的类方法_new_,其作用是创建对象并返回

(21)关于类和对象说法正确的是(A)

          A.根据一个类可以创建多个对象,而每个对象只能是某一个类的对象

          B.根据一个类只能创建一个对象,而每个对象只能是某一个类的对象

          C.根据一个类可以创建多个对象,而每个对象可以属于多个类

          D.根据一个类只能创建一个对象,而每个对象可以属于多个类

(22)下列关于构造方法的说法错误的是(C)

          A.构造方法是 Python类中的内置方法之一,在创建一个类对象时会自动执行,负责完成新创建对象的初始化工作

          B.构造方法中,除了self,也可以设置其他参数

          C.构造方法的参数只能是self

          D.构造方法也可以设置默认参数

(23)进行self>=other运算时自动执行的内置方法是(C)

          A._gt_ (self,other)        B._It_(self,other)         C. _ge_ (self,other)           D. _le_(self,other)

(24)关于super 方法的说法错误的是(D)

          A.super 方法用于获取父类的代理对象以执行已在子类中被重写的父类方法

          B. super方法有两个参数,第一个参数是要获取父类代理对象的类名

          C.在一个类A的定义中调用super方法时,可以将两个参数都省略,此时,super()等价于super(A, self)

          D.第二个参数必须传入对象名,该对象所属的类必须是第一个参数指定的类或该类的子类,找到的父类对象的self 会绑定到这个对象上

(25)关于类方法的说法错误的是(D)

          A.类方法是指使用@classmethod修饰的方法

          B.类方法的第一个参数是类本身(而不是类的的实例对象)

          C.类方法既可以通过类名直接调用,也可以通过类的实例对象调用

          D.类方法只能通过类名直接调用

(26)关于静态方法的说法错误的是(B)

          A.静态方法是指使用 @staticmethod 修饰的方法

          B.静态方法的第一个参数是类本身(而不是类的实例对象)

          C.静态方法既可以通过类名直接调用,也可以通过类的实例对象调用

          D.静态方法中没有类方法中的第一个类参数

(27)已知 Complex类的类方法add(cls,c1,c2)实现两个复数的相加运算,程序可以使用不同的方式调用该方法,下面错误的调用方式是(C)

          A.c3=Complex.add(c1,c2)                          B..c3=c1.add(c1,c2)

         C.c3.add(Complex,c1,c2)                             D.c3=Complex().add(c1,c2)

(28)关于动杰扩展类的说法正确的是(A)

          A. Python除了可以在定义类时定义属性和方法外,还可以动态地为已经创建的对象绑定新的属性和方法

         B.Python 只能在定义类时定义属性和方法,不能动态扩展

         C.Python只能动态扩展属性,不能动态扩展方法

         D.Python只能动态扩展方法,不能动态扩展属性

(29)写出下面程序的输出结果

class Student:
    name='Unknown'
    age=0
if __name__=='__main__':
    print('姓名:',Student.name)
    print('年龄:',Student.age)
    stu=Student()
    print('stu姓名:%s,年龄:%d'%(stu.name,stu.age))
    Student.name='张三'
    Student.age=18
    print('stu姓名:%s,年龄:%d'%(stu.name,stu.age))
    stu.name='李四'
    stu.age=19
    print('stu姓名:%s,年龄:%d'%(stu.name,stu.age))
    Student.name='张三'
    Student.age=18
    print('stu姓名:%s,年龄:%d'%(stu.name,stu.age))
 
 
#输出结果
姓名: Unknown
年龄: 0
stu姓名:Unknown,年龄:0
stu姓名:张三,年龄:18
stu姓名:李四,年龄:19
stu姓名:李四,年龄:19
(30)写出下面程序的输出结果

class Person:
    def __init__(self,name):
        self.name=name
    def Display(self):
        print(self.name)
class Student(Person):
    def __init__(self,sno,name):
        super().__init__(name)
        self.sno=sno
    def Display(self):
        super(Student,self).Display()
        print(self.sno)
if __name__=='__main__':
    per=Person("张三")
    per.Display()
    stu=Student(78,"李四")
    stu.Display()
 
 
#输出结果
 
张三
李四
78
(31)写出下面程序的输出结果

class Person:
    pass
class Student(Person):
    pass
if __name__=='__main__':
    per=Person()
    stu=Student()
    print("stu所属类是Person类的子类",isinstance(stu,Person))
    print("student所属类是Person类的子类",issubclass(Student,Person))
    print("per所属类是Student类的子类",isinstance(per,Student))
    print("Person类是Student类的子类",issubclass(Person,Student))
    print('stu对象所属的类:',type(stu))
    print('per所属的类:',type(per))
 
 
#输出结果
stu所属类是Person类的子类 True
student所属类是Person类的子类 True
per所属类是Student类的子类 False
Person类是Student类的子类 False
stu对象所属的类: <class '__main__.Student'>
per所属的类: <class '__main__.Person'>
(32)写出下面程序的输出结果

class Cylinder:
    Radius=5
    Height=10
    def Display(self):
        print("圆柱体半径为",self.Radius)
class Circle:
    Radius=50
    def Display(self):
        print("圆半径为",self.Radius)
if __name__=='__main__':
    c1=Cylinder()
    c2=Circle()
    c1.Display()
    c2.Display()
 
 
#输出结果
圆柱体半径为 5
圆半径为 50
(33)下面程序对圆柱体类Cylinder实现动态绑定方法,请将程序填写完整

from types import MethodType  #从types模块导入MethodType方
class Cylinder:
    pass
def SetRadius(self,r):
    self.Radius=r
def SetHeight(self,h):
    self.Height=h
if __name__=='__main__':
    c1=Cylinder()
    c2=Cylinder()
    c1.SetRadius=MethodType(SetRadius,c1)
    Cylinder.SetHeight=SetHeight
    c1.SetRadius(10)
    c2.SetRadius(20)   #c2对象未绑定SetRadius方法,此语句有误
    c1.SetHeight(30)
    c2.SetHeight(40)
(34)定义Circle类,要求:包括私有属性_radius,构造函数为半径赋值,构造函数的默认参数值为0,析构函数输出适当信息,普通方法SetRadius用于设置半径,普通方法Area返回圆面积,内置方法_str_用于输出圆面积,内置方法_gt_用于比较两个圆面积大小,并创建两个实例分别验证上述功能

PI=3.14 
class Circle:
    __radius=0
    def __init__(self, r=0):
        self.__radius=r
    def SetRadius(self,r):
        self.__radius=r;
    def __str__(self):
        return '面积:'+str(self.__radius*PI*PI)
    def __del__(self):
        print('半径为',self.__radius,"的圆被销毁")
    def Area(self):
        return self.__radius*self.__radius*PI
    def __gt__(self,other):
        return self.Area()>other.Area()
if __name__=='__main__':
    c1=Circle()
    c2=Circle(10)
    c1.SetRadius(5)
    print(c1)
    print(c2)
    if(c1>c2):
        print("1>2")
    else:
        print("1<=2")
    del c1
    del c2
 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着国家大数据战略的深入实施,各行业智慧化建设急需数据分析人才和智能应用人才。智慧化简单来说是一个以机器替换人力的过程,而机器的“灵魂”是程序。Python已经成为公认的驱动大数据智能应用的主流编程语言Python程序设计的书籍已经琳琅满目,每一本书都凝聚了作者对Python的理解和对程序设计的认识,都是作者编程开发和教学经验的总结,都折射出作者的专业背景。由于大数据专业学生对程序设计的要求不是很高,但又需要具备一定的计算思维能力,熟悉用程序进行数据分析的一般流程,因此程序设计教材要言不甚深、文不甚俗,既要覆盖相关技术,又不能面面俱到,注重对问题的分析和解释,用程序表达算法。鉴于此,我们编写了本书。 本书每一章的标题都以Python开头,凸显Python在各个部分都有其独特的编程理念和方法。与其他高级编程语言如C、C++和Java等相比,Python在数据的表示、处理和可视化方面都有绝对的优势。有编程基础的学习者在学习Python时最好能忘掉以往程序设计语言的语法,彻底转变观念,以全新的姿态融入到Python的编程特点和规律之中。如变量定义、数据型、数据结构、控制结构、和对象、文件访问、数据分析和可视化,每一部分都有其特别之处,都值得我们重新认识,重新使用,重新熟悉。每一章开始的思维导图都是对本章技术脉络的梳理,开门见山地给学习者展示本章的知识和技术体系,以便学习者在学习过程中始终能保持思路清晰和整体把握。每一章开头的本章导读都是编者多年来程序开发与设计教学经验的提炼与升华,都是对程序设计的理解和感悟,值得学习者深入领会。每一章开头的本章要点都是要求学习者深入理解的重要知识和熟练掌握的关键技术。每一章的小结都是对本章要点的具体解释,供学习者复习查询。 本书为河北省高等教育教学改革研究与实践项目“新工科背景下警务大数据应用专业人才培养模式与教学实践研究”(编号:2018GJJG450)的阶段性成果。 下面是本书的体系结构图。 第1章Python编程初步。学习本章,要了解Python作为一种计算机程序设计脚本语言,结合了解释性、编译性和互动性的特点;了解在Linux和Windows中安装Python方法;了解IDLE、PyCharm和Jupyter三种常用Python程序编辑环境。工欲善其事,必先利其器,通过对本章的学习,学习者可拥有一个强大的编程工具,从此开启数据分析编程之旅。 第2章Python语言基础。Python作为一门与计算机交流的编程语言,有着跟自然语言相似的特点:字、词、句、段落、篇章,以及相应的行文语法规则。学习本章,要理解程序行文的字词句,主要包括基本数据型、常量和变量、运算符和表达式;理解程序的段落和篇章,主要包括常用内置函数、库函数和系统函数的使用;掌握程序的语法规则,主要包括常用的变量定义和标识符命名规则、语句组织成文编码规则等。这些都是程序设计的基础,学习者只有对此熟练掌握后,才能在后续的学习中得心应手。 第3章Python组合数据型。组合数据型是Python语言区别于其他高级编程语言的一大特色,通过组合数据型,省去了其他语言各种复杂数据结构的设计,给编程人员带来了极大的方便,这也是Python流行于数据分析领域的原因之一。学习本章,要熟练掌握Python组合数据型(列表、元组、字符串、字典、集合)的创建、访问和常见基本操作,以及序列解包功能。 第4章 Python控制结构。针对物质随时间由简单向复杂、由低级向高级发展的顺序,Python语言有相应的顺序结构语句;针对物质运动发展的条件性,Python语言有相应的选择结构语句;针对物质运动的波浪式前进螺旋式上升规律,Python语言有相应的循环结构语句。学习本章,要从马克思主义自然哲学视角理解Python语言在描述物质运动规律时的表达方式;掌握用Python语言描述常用算法,解决一些基本问题的方式。 第5章 Python函数与模块。有些经常用到的能实现特定功能的代码块,我们总是不希望每次用到时都重写一遍,甚至不希望复制一遍,但又想重复使用。Python里这些经常重用的代码块以函数(Function)的形式被定义,每一次复用被称为函数调用,计算机依然要执行重用的代码。学习本章,要理解函数的概念,掌握定义函数的方法,深刻理解函数调用中参数的传递(值传递、地址传递),理解变量的作用域(变量的作用范围或变量的生命周期),理解函数集合模块、包等概念,掌握模块和包的创建及使用方法。 第6章 Python面向对象程序设计。面向过程的程序设计方法难以保证程序的安全性和代码的可重用性,而面向对象程序设计方法能够更好地提高大型程序的质量和开发效率,增强程序的安全性和提高代码的可重用性。学习本章,重在理解面向对象程序设计思想、和对象的概念

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值