24-25天
2018-04-23 17:15 dalao说得对 阅读(143) 评论(0) 编辑 收藏 举报24天讲了内置函数:
1、__call__ ,如
class A:
def __call__(self):
print('a')
则 A()() 打印出a
2、__str__ 与 __repr__ 如:
class B:
def __str__(self):
return 'b'
def __repr__(self):
return 'c'
则有 b = B()
print('b')结果为b
引掉__str__方法后结果为c
按照老师的说法叫做repr是str的备胎
3、__format__
这个是用作输出,让你输出的东西按照一定的格式来。现阶段感觉暂且不考虑
老师的例子:
format_dict={
'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
}
class School:
def __init__(self,name,addr,type):
self.name=name
self.addr=addr
self.type=type
def __format__(self, format_spec): #format_spec = 'nat'
if not format_spec or format_spec not in format_dict:
format_spec='nat'
fmt=format_dict[format_spec] #'{obj.name}-{obj.addr}-{obj.type}'
return fmt.format(obj=self) #'{obj.name}-{obj.addr}-{obj.type}'.format(obj=self)
s1=School('oldboy1','北京','私立')
print(format(s1,'nat')) #s1.__format__('nat')
print(format(s1,'tna'))
print(format(s1,'tan'))
print(format(s1,'asfdasdffd'))
4、__eq__ 作等价
这个内置函数的左右跟双等于号差不多,相当于可以自定义一种算法来判定二者的相等性
例子就是老师曾经说过的一个题目:
想一个办法将100个人的信息去重(名字性别身份证不会变,但年龄会变),
其用到的办法就是用到__eq__,用到__hash__
用hash计算名字+性别(都是字符串),然后修改eq的等价方案实现目的。
等会找下源码
5、__new__
实例化一个对象的时候,先用到的就是new方法,用来开辟一块内存空间存储将要创建的对象
最常用到的地方就是老师上课举得那个单例模式
因为自始至终就开辟了一块内存空间,所以无论实例化多少个对象,其结果只会不断的覆盖
以上就是24天讲到的所有内容,其实还有一个__delattr__,看名字就知道这个是用作删除的,
可以用来作自定义删除,感觉没什么用
25天讲了三个模块(json,pickle,shelve):
json pickle用法一样,都是拥有4个方法:dump,dumps,load,loads
也同样都是dump,load是对文件操作
dumps,loads是对字节操作(等于说现阶段就用不带s的)
json无法对多行的数据进行读,局限性很大,但什么语言都能用这东西。
pickle只能在python中用,而且必须要有这个类,局限性也算是比较大了,但起码现在来说挺好使。
周末做作业的时候发现了pickle的一个特性,就是不能直接用里面的数据进行比对,
必须先将其取出放置列表(当然放别处也ok),否则无效。
取值的时候要模仿for,但却不能用
while True:
try:
a.append(pickle.load(文件句柄))
except EOFerror:
break
还有一个shelve,这个可以放字典(元组当key也是ok的),但有个bug
# import shelve
# f = shelve.open('shelve_file', flag='r')
# # f['key']['int'] = 50 # 不能修改已有结构中的值
# # f['key']['new'] = 'new' # 不能在已有的结构中添加新的项
# f['key'] = 'new' # 但是可以覆盖原来的结构
# f.close()
不过听说在python2里面很好用
最后又说了hashlib这个模块,这个模块是用来加密的,具体例子:
def lock(p):
m = hashlib.md5()
m.update(p.encode('utf-8'))
return m.hexdigest
注意这里返回的是一个函数地址,要想看结果后面要加括号
算法最常见的就是md5,但很容易被暴力破解,所以有了加盐的方法。
def lock1(p):
m = hashlib.md5('wahah'.encode('utf-8'))
m.update(p.encode('utf-8'))
return m.hexdigest
也可以动态加盐,就是用用户输入的用户名作为盐。