1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 《Python语言程序设计》王恺 王志 机械工业出版社 第四章 面向对象 课后习题答案

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

时间:2019-05-13 20:32:50

相关推荐

《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

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