《Python语言程序设计》王恺 王志 李涛 机械工业出版社 第4章 面向对象 课后习题答案【强烈推荐】

点个吧,秋梨膏!!!!!,建议收藏一波

第4章 面向对象

  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),需要用到的装饰器为@score.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. lt(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所属类是Studnet类的子类”,isinstance(per,Student))
    print(“Person类是Student类的子类”,issubclass(Person,Student))
    print(‘stu对象所属的类:’, type(stu))
    print(‘per对象所属的类:’, type(per))
    答:输出结果为:
    stu所属类是Person类的子类 True
    Student类是Person类的子类 True
    per所属类是Studnet类的子类 False
    Person类是Student类的子类 False
    stu对象所属的类: main
    .Student’>
    per对象所属的类: 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方法
    c1.SetRadius=MethodType(SetRadius,c1) 
#为Cylinder类绑定SetHeight方法
    Cylinder.SetHeight=SetHeight  
    c1.SetRadius(10)
    c2.SetRadius(20)   #c2对象未绑定SetRadius方法,此语句有误
    c1.SetHeight(30)
    c2.SetHeight(40)
  1. 定义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

点个吧,秋梨膏!!!!!,建议收藏一波
《Python语言程序设计》王恺 王志 李涛 机械工业出版社 第4章 面向对象 课后习题答案【强烈推荐】_第1张图片

你可能感兴趣的:(python课后习题,python,开发语言,后端)