[自用备份]廖雪峰python面向对象习题作业

[自用备份]廖雪峰python面向对象习题作业

时隔n个月,up终于想起了自己的密码.回来更文.因为刚开始写,代码不是很简洁.不过答案都是测试过的.话不多说,Here we go!

 

1.练习

请把下面的Student对象的gender字段对外隐藏起来,用get_gender()set_gender()代替,并检查参数有效性

 

 

解答:

class Student(object):
    def __init__(self, name, gender):
        self.__name = name
        self.__gender = gender
    def get_name(self):
        return self.__name
    def set_gender(self,gender):
        if self.__gender =="female"or"male":
            self.__gender=gender
        else:
            raise ValueError("bad gender")

    def get_gender(self):
        return self.__gender

课后补充:

1.这里也可以写成 if gender in("male","female"):

2.题目上没说名字不能改.但是保险起见,还是把名字限制住

 

2.练习

为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:

 

 

解答:

class Student(object):
    count = 0

    def __init__(self, name):
        self.name = name
        self.__set__count()
    def __set__count(self):
        Student.count +=1

课后补充:不要让实例属性和类属性的名称相同!

 

3.练习

请利用@property给一个Screen对象加上widthheight属性,以及一个只读属性resolution

 

 解答:

class Screen(object):
    @property
    def width(self):
        return self._width
    @width.setter
    def width(self,value):
        self._width=value
    @property
    def height(self):
        return self._height
    @height.setter
    def height(self,value):
        self._height=value
    @property
    def resolution(self):
        return self._width*self._height

课后补充:1.resolution有分辨率的意思,分辨率=长度*宽度

               2._width和_height是为了区别width和height,不加下划线也行但名字不能相同!

 

 

4.练习

Studentgender属性改造为枚举类型,可以避免使用字符串:

 

 

解答:

from enum import Enum,unique
@unique
class Gender(Enum):
    Male = 0
    Female = 1
class Student(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

课后补充:

这个题不太理解,稀里糊涂地做出来了.

下面粘贴一段枚举类型的笔记辅助理解.