您的位置:首页 > 编程语言 > Python开发

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

2018-02-08 20:28 399 查看

模块

包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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: