seven day--面向对象及模块

Posted yuyou123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了seven day--面向对象及模块相关的知识,希望对你有一定的参考价值。

复习


对象
实例化过程:
组合:
super 派生prop
多态:建立一个父类,让所有传递的数据类型都继承这个父类。

学习方法: xy rz 时间
1.画知识的思维导图:思维导图一定要画!
python:基础数据类型 文件处理 函数 模块 面向对象

整理;时间分片
技术分享图片
 1 # 面向对象
 2 # 类 实例化 对象/实例
 3 # 什么是类? 拥有相同属性和方法的一类事物
 4 # 什么是对象? 类的一个实际表现,给类中的属性填上具体的值,能够使用类中的方法
 5 # 实例化的过程中做了那些事儿?
 6     # 对象 = 类名()
 7     # 首先要创造一个对象
 8     # 被创造出来的这个对象会作为参数传递给__init__方法中的第一个参数
 9     # 调用__init__方法,传递一些初始化参数 —— 初始化方法
10     # 将初始化之后的对象返回给调用者
11 # 查看属性和调用方法
12     # 类名 : 静态属性、类属性
13     # 对象 : 调用方法(动态属性)、查看对象的属性
14 # 组合 : 两类事物之间的所有关系,什么有什么的关系
15 # 继承 :两个类之间的包含关系,什么是什么的关系
16     # 钻石继承问题
17         # 经典类 : 在一个子类中寻找方法的时候,从子类到父类先找到的名字会被执行。
18                     # 深度优先就是在经典类中找类的顺序的一种算法
19         # 新式类 : 广度优先
20         # py2中,主动继承object类的都是新式类,它的子类也是新式类
21         # py3中,所有的类都是新式类,都继承object
22     # super :
23         # 自己有父类也有的时候,在单继承中super就可以用父类的
24         # 在多继承中 super遵循mro广度优先顺序
25     # 派生 :
26         # 属性
27         # 方法
28 # 多态
29         # python中不需要程序员自己实现多态
30         # 在其他强数据类型语言的面向对象中,我要传递一个参数必须指定这个参数的数据类型
31         # 但是,往往在这个地方需要传递的不止一种类型
32         # 建立一个父类,让所有要传递的数据类型都继承这个父类,在参数指定数据类型的时候
33         # 指定父类名就可以了
34 
35 # def eat(Animal alex):pass
36 
37 
38 # 画知识的思维导图:思维导图一定要画!
39     # python :基础数据类型 文件处理 函数 模块 面向对象
40     # 函数
41         # 函数的定义 :参数和返回值
42         # 生成器函数
43         # 递归函数
44         # 内置函数
45         # 匿名函数
46     # 面向对象
47         # 基础概念
48         # 定义
49         # 三大特性 : 封装
50                     # 多态
51                     # 继承
52 
53 # 北大研究生 :
54     # 整理
55     # 时间分片
View Code

一、封装

广义的封装:把变量和函数都放在类中
狭义的封装:把一些变量或方法隐藏起来,不对外公开
公有的;
私有的:__name
例子一
技术分享图片
 1 #例子一
 2 # class Person:
 3 #     __country=中国 #私有的静态属性
 4 #     print(__country)   #类里的代码,从定义开始就执行,会输出 中国
 5 #
 6 # #print(Person.__country)   #AttributeError: type object Person has no attribute __country
 7 # #私有的名字 ,只能在类的内部使用,不能在类的外部使用
 8 #
 9 # print(Person._Person__country)#可以调用,但不能使用该方式。
10 # print(Person.__name)   #在类的外部不能定义一个私有变量
View Code

私有的变量:在类的内部 如果使用__变量的形式会发生变形,python会自动的为你加上_类名
例子:用户名密码--变形
技术分享图片
 1 class Person:
 2     __country = 中国
 3     def __init__(self,name,pwd):
 4         self.name = name
 5         self.__pwd = pwd      # 私有的对象属性
 6     def login(self):
 7         print(self.__dict__)
 8         if self.name == alex and self.__pwd == alex3714:
 9             print(登录成功)
10 
11 alex = Person(alex,alex3714)
12 alex.login()
13 print(alex.__dict__)   #{name: alex, _Person__pwd: alex3714}
14 print(alex.__pwd)
View Code

不允许调用类中的私有属性!! 例子--制造密码
技术分享图片
# class Person:
#     def __init__(self):pass
#     def __制造密码转换(self,inp):
#         print(eating)
#     def 注册(self):
#         inp = input(pwd>>>)
#         加密之后的密码 = self.__制造密码转换(inp)
View Code

# 静态属性 、 对象属性、 方法(动态属性) 前面加上双下划綫都会变成私有的
# 私有的特点就是只能在类的内部调用,不能在类的外部使用!!
面试题 in Foo
技术分享图片
 1 # class Foo:
 2 #     def __init__(self):
 3 #         self.__func()    # self._Foo__func
 4 #     def __func(self):
 5 #         print(in Foo)
 6 #
 7 # class Son(Foo):
 8 #     def __func(self):    # _Son__func
 9 #         print(in son)
10 #
11 # s = Son()
inFoo
技术分享图片
 1 # class Foo:
 2 #     def __init__(self):
 3 #         self.func()
 4 #     def func(self):
 5 #         print(in Foo)
 6 
 7 # class Son(Foo):
 8 #     def func(self):
 9 #         print(in son)
10 #
11 # s = Son()
inson
二、类中的装饰器方法:
三个装饰器函数:classmethod    staticmethod    property(将一个函数伪装成属性 @property 重要)
圆形类 面积 打折--修改删除不常用 property 必须掌握
技术分享图片
 1 from math import pi
 2 class Circle:
 3     def __init__(self,r):
 4         self.r=r
 5     @property
 6     def area(self):
 7         print(area被执行了...)
 8         return self.r**2*pi
 9     @property
10     def perimeter(self):
11         return self.r*2*pi
12 # # 方法 动词 —— 动作或者技能
13 # # 名词 圆的面积 圆的周长 圆的班级
14 #将一个函数伪装成属性 @property
15 
16 c=Circle(3)
17 print(c.area)
18 print(c.perimeter)
圆形类
技术分享图片
 1 # #练习计算面积--zijixiede
 2 # class mj:
 3 #     def __init__(self,l,h):
 4 #         self.l=l
 5 #         self.h=h
 6 #     @property
 7 #     def area(self):
 8 #         return self.h *self.l
 9 # ss=mj(2,3)
10 # print(ss.area)
计算面积
技术分享图片
 1 #property   和 __私有的名字一起使用----------打折例子
 2 
 3 class Goods:
 4     def __init__(self,price,discount):
 5         self.__price=price
 6         self.discount=discount
 7     @property
 8     def price(self):
 9         return self.__price * self.discount
10     @price.setter     #修改价格
11     def price(self,newprice):
12         self.__price=newprice
13     @price.deleter  #删除
14     def price(self):
15         del self.__price
16 
17 apple=Goods(8,0.7)
18 print(apple.price)
19 apple.price=10
20 print(apple.price)
21 print(apple.__dict__)
22 del apple.price
23 print(apple.__dict__)
24 # print(apple.price)
25 
26 结果:
27 5.6
28 7.0
29 {_Goods__price: 10, discount: 0.7}
30 {discount: 0.7}
打折例子

国籍例子--classmethod 变成类方法。使用场景:# 如果某一个类中的方法 并没有用到这个类的实例中的具体属性
# 只是用到了类中的静态变量 就使用类方法
技术分享图片
 1 # class Person:
 2 #     Country = 中国人
 3 #     @classmethod       #把func变成了一个类方法
 4 #     def func(cls):     # cls是指向类的内存空间
 5 #         print(当前的角色的国籍是%s%cls.Country)
 6 
 7 # alex = Person()
 8 # alex.func()
 9 # Person.func()
10 # 如果某一个类中的方法 并没有用到这个类的实例中的具体属性
11 # 只是用到了类中的静态变量 就使用类方法
View Code

登录例子--如果一个方法,既不会用到对象中的属性也不会用到类中的属性,就应该被定义为一个静态方法 staticmethod
技术分享图片
1 class Student:
2     @staticmethod
3     def login():
4         name = input(name : )
5         pwd = input(pwd : )
6         if name ==‘‘ and pwd ==‘‘:
7             print(实例化)
8 
9 Student.login()
staticmethod
三、序列化模块  非常重要
1.什么叫序列化:数据类型-->字符串的过程
2.用序列化情况:固态存储;网络传输
3.模块:
json 通用的 支持的数据类型 list tuple dict
pickle python中通用的 ,支持几乎所有python中的数据类型
shelve python中使用的便捷的序列化工具
4个方法 及例子
dumps 内存中做操作 字典转字符串的过程 ——序列化
loads 内存中做操作 字符串 转回其他数据类型 —— 反序列化
dump 和文件交互 一次性写的数据,只能一次性读出
load 从文件中反序列化 不能多次load解决办法:
如果要dump多条数据,每一条数据先dumps一下 编程字符串 然后打开文件 write写进文件里 \n
读取的时候按照标志读取或者按行读
读出来之后,再使用loads
技术分享图片
 1 # 什么叫序列化呢?
 2     # { 10100011:{name:,age: ,class:},}
 3     # 数据类型 —— 字符串的过程
 4 # 什么时候要用序列化呢?
 5     # 数据从内存到文件
 6     # 数据在网络上传输  字节 - 字符串 - 字典
 7 # python中的序列化模块都有哪些?
 8     # json   通用的 支持的数据类型 list tuple dict
 9     # pickle python中通用的 支持几乎所有python中的数据类型
10     # shelve python中使用的便捷的序列化工具
11 
12 # dumps loads
13 # dump load
14 
15 import json
16 dic = {"k":v}
17 # print(type(dic))
18 # json_dic = json.dumps(dic) #{"k": "v"}  # 字典转字符串的过程 ——序列化
19 # print(json_dic)
20 # print(dic)    #{k: v}
21 # print(type(json_dic))
22 # print(json.loads(json_dic)) # 字符串 转回其他数据类型 —— 反序列化
23 
24 # with open(d,w) as f:
25 #     json.dump(dic,f)       # dump是和文件交互的
26 #     json.dump(dic,f)       # dump是和文件交互的
27 
28 # with open(d) as f:
29 #     print(json.load(f))      # 从文件中反序列化
30 
31 # 如果要dump多条数据
32 # 每一条数据先dumps一下 编程字符串 然后打开文件 write写进文件里 \n
33 # 读取的时候按照标志读取或者按行读
34 # 读出来之后 再使用loads
概念
            例子
技术分享图片
# with open(aaa,w) as f:
#     str_dic = json.dumps(dic)
#     f.write(str_dic+\n)
#     f.write(str_dic+\n)
#     f.write(str_dic+\n)
#     f.write(str_dic+\n)

# with open(aaa) as f:
#     for line in f:
#         print(json.loads(line.strip()))
例子

pickle 对象序列化文件 例子 打印出显示二进制类型的,要以wb打开,要以rb去读
dump,load取值就行,加异常处理
技术分享图片
 1 # import pickle
 2 # class A:
 3 #     def __init__(self,name):
 4 #         self.name = name
 5 #
 6 # alex = A(alex)
 7 # print(pickle.dumps(alex))
 8 # with open(bbb,wb) as f:
 9 #     pickle.dump(alex,f)
10 #     pickle.dump(alex,f)
11 #     pickle.dump(alex,f)
12 #
13 # with open(bbb,rb) as f:
14 #     while True:
15 #         try:
16 #             obj = pickle.load(f)
17 #             print(obj.name)
18 #         except EOFError:
19 #             break
pickle例子

pickle与json区别
1.pickle支持更多的数据类型
2.pickle的结果是二进制
3.pickle在和文件交互的时候可以被多次load

shelve读博客--不常用 不能同时进行写操作
网络传输
四、三个模块
1.hashlib模块 重要 摘要算法 单向不可逆
2.logging模块 重要
3.configparse模块 一般
1.hashlib模块:以后登录都要加密密码!!!
作用1:存储用户密码的时候,不要存储明文
包含了多种算法的模块
将一个字符串进行摘要运算,拿到一个不变的 固定长度的值
md5算法:32位
sha算法:数字越大,越复杂,时间越长 sha1 40位
技术分享图片
1 # import hashlib
2 # #hashlib.md5()#<md5 HASH object @ 0x000000000218C8A0>一种算法
3 # md5obj=hashlib.md5() #实例化一个md5摘要算法的对象
4 # # 能够让一个字符串 唯一的 对应一个固定的值
5 # md5obj.update(lijie123..) #使用md5算法的对象来操作字符串
6 # #获取算法的结果
7 # ret=md5obj.hexdigest()
8 # print(ret,type(ret),len(ret))
View Code

撞库 别人有一个庞大的库,存储了很多字符串和MD5值得关系
有了加盐 例子
动态加盐 userinfo表 把username作为盐 例子
作用2:校验文件一致性
分多次对一个文件进行摘要结果一致
练习题:。。。

2.configparse模块 一般
快速处理配置文件 创建 实例化-字典
查看 default 类似于全局变量
用到的时候去博客中查看即可

3.logging模块--日志模块 重要
程序执行的中间过程--需要记录下来
程序出错---日志 对内看的
给用户看的---对外看的
用法:1.简单配置 例子
参数:level,加format参数 ,detefmt,filename,filemode
--中文存在乱码,屏幕与文件不能同时展示

2.logger对象的方式配置
logger=logging.getLogger()
往文件中输入 写法,参数



五、反射!! 及面向对象进阶
!!!!!!反射  百分重要
定义:通过字符串数据类型的 变量名,来访问变量的值
使用场景:
1.类名 反射 静态属性
2.对象名 反射 对象属性和方法

3.模块 反射 模块中的名字 (属性方法 类中的)
4.反射自己所在文件中的名字!!
sys.modules[‘__main__‘] 例子 练习反射类、方法。。。
x.y的形式,都可以用反射
作业例子。。
isinstance和issubclass两个方法不常用
setattr设置属性--了解
delattr 删除属性--了解 obj对象

__new__方法 !非常重要 面试经常被问! Foo例子
__new__方法 构造方法,创建一个对象
__init__初始化方法
先执行new方法,object.new() 再执行init
经历过程:
# Foo() --> python解释器接收到你的python代码
# python解释器替你去做了很多操作
# 包括 主动帮助你 调用 new方法 去创造一个对象 —— 开辟内存空间 —— python语言封装了开辟内存的工作
# object的new方法里 —— 帮你创造了对象
# 调用init用到的self参数 就是new帮你创造的对象

什么叫单例模式:
设计模式--23种(赵博士以后会讲)
单例模式:某一类只有一个实例 person例子 解释孩子例子

__len__ 例子,类中的内置方法,很多都和内置函数相关!
__str__ 重要!str方法必须返回字符串类型
其它自己看看!

技术分享图片
 1 aaa.startswith(a)
 2 ret=getattr(aaa,startswith)  #一个对象
 3 print(ret(a))  #True
 4 
 5 class Person:
 6     def __init__(self,name):
 7         self.name=name
 8     def eat(self):print(eating)
 9     def drink(self):print(drinking)
10     def play(self): print(playing)
11     def sleep(self): print(sleeping)
12 
13 # alex=Person(alex)
14 # print(getattr(alex,name))
15 # while True:
16 #     inp = input(>>>)
17 #     if hasattr(alex,inp):
18 #         getattr(alex,inp)()
19 #小结:
20 # 首先 使用getattr取获取一个名字,如果在这个对象的命名空间中没有这个名字 会报错
21 # getattr的反射好伴侣 hasattr
22 # 如果使用getattr取获取一个方法,那么只能拿到这个方法的内存地址 加上括号就是执行,当然,括号里的参数可以照传不误
23 # 如果getattr获取一个属性,那么直接使用反射就可以获取到值
例子

六、项目规范


模块就是一个py文件
所谓的模块导入 就是执行了这个文件而已
# sys.path 列表里存储了所有模块导入的路径

软件开发规范 项目名称不要用中文,不要太长
bin conf..core db log(登录信息和操作信息)..图
sys.path 在pycharm中路径不准,可在cmd中查看

所有的模块导入,都需要精确到具体的模块
from core import core2
core2.login()
当一个文件 被直接执行的时候,这个文件的__name__属性是__main__
当这个文件被当做模块导入的时候,这个文件的__name__属性是文件名
core2 maneger文件(在此文件中from)

注:不能循环引用
config目录:userinfo_path=‘copy path即可‘
从start.py执行,,,,导入core中
settings两种写法。。。绝对路径或join那种
 

 






































































































































以上是关于seven day--面向对象及模块的主要内容,如果未能解决你的问题,请参考以下文章

python day6

day23 面向对象

面向对象day07:多态-面向对象使用场景--知识点回顾

six day--面向对象

Python面向对象基础-day6

重修课程day26(面向对象6之反射,内置函数和常用模块)