代码改变世界

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

也可以动态加盐,就是用用户输入的用户名作为盐。