模块
包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()