这篇博客记录廖雪峰python教程的习题(三)

模块

包package 是一个目录,是为了避免不同的人使用相同的模块名(py文件的文件名)
每一个包下面都必须得有一个init.py文件。而且目录(package)下面可以有子目录,里面又可以有init.py文件以及其他的py文件,比如一个叫abc.py的文件就是名叫abc的模块。如果一个xyz.py文件在一个my_company目录下面,那么此时xyz.py的模块名就叫做 my_company.xyz,而且该package包下面的.init.py本身就是一个模块,模块名就是包的名字 my_company

比如:
mycompany
├─ web
│ ├─ init.py
│ ├─ utils.py
│ └─ www.py
├─ init.py
├─ abc.py
└─ xyz.py
mycompany.web也是一个模块,请指出该模块对应的.py文件。
就是 web目录下的init.py
总结一下就是 python里的模块就是一个py文件,里面是很多python代码,可能封装了几个函数。

先自己写几个代码,熟悉一下相关的功能:
首先score 和name 都可以在外部访问,也就是你在外边调用xuan.name 和xuan.score 是可以正确运行的

面向对象编程

类和实例

#首先来复习一下面向对象编程的几个小栗子
#由于name,score这里没有设成private 变量,因此外部仍然可以访问:xuan.name xuan.score 并且可以通过赋值进行修改name 和score的值

class Student(object):
    def __init__(self,name,score):  #__init__()里面定义的是属性
        self.name=name
        self.score=score

    def print_info(self):  #类里边的函数就是方法,类的具体实例可以进行调用该方法
        print("name:%s;score:%s"%(self.name,self.score))
    def level(self):
        if self.score>=90:
            print("the level is :A")
        elif self.score>=80:
            print("the level is :B")
        else:
            print('the level is :C')

def main():
    xuan=Student("Zhangxuan",100)
    information=xuan.print_info()
    my_level=xuan.level()
    #在命令行输入 xuan.name 和xuan.score 是可以得到具体的name score ,因为不是私有变量,外部可以访问

main()

下面把name 和score都设成私有变量self.__name,self.__score,这样在外部访问self.__name self.__score 是不可以的

代码

class Student(object):
    def __init__(self,name,score): #__init__()里面定义的是属性      
        self.__name=name  #那name变量设成私有变量
        self.__score=score
    def print_info(self):
        print("name:%s;score:%s"%(self.__name,self.__score))
    def level(self):
        if self.__score>=90:
            print("your level is A")
        elif self.__score>=80:
            print("your level is B")
        else:
            print("your level is C")

def main():
    xuan=Student("Zhangxuan",88)
    xuan.print_info()
    xuan.level()   
    #在命令行输入 xuan.__name xuan.__score 是得不到name 和score的,因为是私有变量
main()

那么对于私有变量我们是否可以访问它的值呢,如何访问或者修改,其实我们可以在类内重新定义相关函数,用来获取或修改私有变量的值,因为私有变量在类内是可以进行修改的

class Student(object):
    def __init__(self,name,score):
        self.__name=name
        self.__score=score
    def print_info(self):
        print("name:%s;score:%s"%(self.__name,self.__score))
    def level(self):
        if self.__score>=90:
            print("your level is A")
        elif self.__score>=80:
            print("your level is B")
        else:
            print("your levle is C")
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
    def set_name(self,name):
        if isinstance(name,str):
            self.__name=name
            return self.__name
        else:
            print("what you input is not a string!")
    def set_score(self,score):
        if score in range(1,101):
            self.__score=score
            return self.__score
        else:
            print("what you input is not proper!")

def main():
    xuan=Student("Zhangxuan",99)  #类Student会自动输出相关的信息包括名字和分数
    my_name=xuan.get_name()    #这一步操作主要是为了证明 name score 被设成私有变量,仍然可以在类内编写函数(方法)在外部获取私有变量的值
    my_score=xuan.get_score()
    print("修改之前我的名字和分数是",end=' ')
    print((my_name,my_score))

    print("**********修改前后**********")

    new_name=xuan.set_name("Zhangxuanxuan")  #主要是为了证明其实仍然是可以修改私有变量的值的 
    new_score=xuan.set_score(100)
    print("修改后的名字和分数分别是:",end=' ')
    print((new_name,new_score))

main()

最后看一下练习题:
“请把下面的Student对象的gender字段对外隐藏起来,用get_gender()和set_gender()代替,并检查参数有效性:class Student(object):
def init(self, name, gender):
self.name = name
self.gender = gender

代码如下:

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

class Student(object):
    def __init__(self,name,gender):
        self.name=name  #把name设成公有变量,外部可以直接访问
        self.__gender=gender #把gender设成私有变量,外部若想访问或修改,单独写一个get_gender和set_gender()方法

    def print_info(self):
        print("name:%s;gender:%s"%(self.name,self.__gender))

    def get_gender(self):
        return self.__gender  #这是原来gender的值,只不过写一个方法来获取私有变量的值

    def set_gender(self,gender):
        if gender in ["female",'male']:  #为了判断输入是否正确
            self.__gender=gender #外部调用时只需要在set_gender()中传入想要修改gender的参数即可
            return self.__gender
        else:
            print("The information of gender that you input is wrong! ")

def main():

    xuan=Student("Zhangxuan",'male') 
    xuan.print_info()#类内会输出相关的信息

    my_name=xuan.name  #由于不是私有变量 可以写
    my_gender=xuan.get_gender() #私有变量gender 需要调用类内单独定义的方法获取
    print("修改之前我的姓名和性别:",end=' ')
    print((my_name,my_gender))

    print("**************修改前后*************")
    new_gender=xuan.set_gender('female')
    print("我的名字和修改后的性别:",end=' ')
    print((my_name,new_gender))


main()

继承和多态

比如我们编写一个Student类:

class Student(object):
    def level(self):
        print("you are a good student")

下面我们定义两个实例:

student=Student()

下面我们就可以调用类里边的方法了(只有实例才可以调用类内的方法!

student.level()

就会返回 "you are a good student"

下面我们可以定义两个子类,注意仍然是类,只不过继承了父类而已,来继承Student类
#子类 继承父类既可以使用父类的全部方法,也可以重新写新的方法

class Xuan(Student): 
    def level(self):
           print("you are a good student and you got A in this test")

比如

Zhangxuan=Xuan()
 Zhangxuan.level() 

就可以输出:

you are a good student and you got A in this test
class XuanXuan(Student): 
    def level(self):
           print("you are a good student and you got B in this test")

比如:

Zhangxuanxuan=XuanXuan()
Zhangxuanxuan.level()

就可以输出:

 you are a good student and you got B in this test

然后我们定义一个新的方法,只不过里面的参数是类

def Person(person):  #这里的person是一个实例 只有实例才可以调用下面的方法level()
    person.level()

接下来我们就可以通过传传入实例:

Person(Student())  #返回you are a good student
Person(Xuan())     #返回you are a good student and you got A in this test
Person(XuanXuan()) #返回you are a good student and you got B in this test

上面的太乱了,对以上分析的代码我又重新整理了一下,代码如下:

class Student(object):
    def level(self):
        print("\nyou are a good student!\n")


class Xuan(Student):  #定义一个子类Xuan 继承了父类Student
    def level(self):  #子类可以覆盖父类的同名方法或者在子类内可以重新定义新的方法
        print("you are not only a good student and you got A in this test!\n")

class XuanXuan(Student):  #又定义了一个子类。继承了父类Student
    def level(self):
        print("you are a good student but you got a C in this test!\n")

def level_test(student):  #这里函数level_test()传的参数是一个实例,类的实例,因为下面调用了类的方法
    student.level()

def main():
    student=Student()  #父类Student的一个实例
    student.level()    #只有类的实例可以调用该类内定义的方法也就是函数

    level_test(Xuan())      #Xuan()是子类Xuan的一个实例
    level_test(XuanXuan())  #XuanXuan是子类XuanXuan的一个实例

main()
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值