• python学习Day23--析构+item系列+hash、eq方法+模块前奏


    【知识点】

     构造方法:申请一个空间

     析构方法:释放一个空间

    1、__del__ 析构方法   是去归还/释放一些在创建对象的时候借用的一些资源

      # 什么时候执行?

        # del 对象的时候

        # python解释器的垃圾回收机制 回收这个对象所占的内存的时候

    2、item系列  和对象使用[ ]访问值有联系

      (1)__getitem__()、__setitem__()和__delitem__()

     1 # item
     2 # item系列  和对象使用[ ]访问值有联系
     3 
     4 obj={'k':'v'}
     5 print(obj)
     6 print(obj['k'])
     7 
     8 class B:
     9     def __getitem__(self,item):
    10         print('执行我了',item)
    11         return getattr(self,item)
    12 
    13     def __setitem__(self,key,value):
    14         setattr(self,key,value)
    15 
    16     def __delitem__(self,key):
    17         delattr(self,key)
    18 
    19 b=B()
    20 b['k1']='v1'      # 调用 __setitem__()
    21 print(b['k1'])    # 调用 __getitem__()
    22 del b['k1']       # 调用 __delitem__()
    item中的getitem,setitem,delitem

      # 在列表里使用:

     1 class B:
     2     def __init__(self,lst):
     3         self.lst=lst
     4     def __getitem__(self,item):
     5         return self.lst[item]
     6 
     7     def __setitem__(self,key,value):
     8         self.lst[key]=value
     9 
    10     def __delitem__(self,key):
    11         self.lst.pop(key)
    12 
    13 b=B(['111','222','333','444'])
    14 print(b.lst[0])     # 111  执行__init__()
    15 print(b[0])         # 111  调用__getitem__()
    16 b[3]='aaa'          # 调用 __setitem__()
    17 print(b[3])         # aaa  调用__getitem__()
    18 del b[2]            # 调用 __delitem__()
    19 print(b.lst)        # ['111', '222', 'aaa']

    3、hash方法

      # 底层数据结构基于hash值寻址的优化操作

      # hash是一个算法   能够把某一个要存在内存里的值通过一系列计算,保证不同的值的hash结果不一样

      # 对同一个值在多次执行python代码的时候hash值是不同的,但是对同一个值在同一次执行python代码的时候hash值永远不变

      # hash(obj)    obj内部必须实现了__hash__方法

    4、__eq__方法

      #  ==这个语法 是完全和__eq__相关

     1 class A:
     2     def __init__(self,name,age):
     3         self.name=name
     4         self.age=age
     5 
     6     def __eq__(self,other):
     7         if self.name==other.name and self.age==other.age:
     8             return True
     9 a=A('alex',45)
    10 aa=A('alex',45)
    11 aaa=A('alex',45)
    12 print(a==aa)       # True
    13 print(a==aa==aaa)  # True   ==这个语法 是完全和__eq__相关

    【一道面试题】

    # 一个类

      #  对象的属性:姓名 性别 年龄

      # 员工管理系统

      # 内部转岗 : python开发 --> go开发

    # 1000个员工,如果几个员工对象的姓名和性别相同,这是一个人(去重)

    # 请对这1000个员工去重

     1 # 一道面试题
     2 class Employee:
     3     def __init__(self,name,age,sex,partment):
     4         self.name=name
     5         self.age=age
     6         self.sex=sex
     7         self.partment=partment
     8 
     9     def __hash__(self):   # 自己定制hsah
    10         return hash('%s%s' % (self.name,self.sex))
    11 
    12     def __eq__(self,other): # 自己定制eq
    13         if self.name==other.name and self.sex==other.sex:
    14             return True
    15 
    16 employ_lst=[]
    17 for i in range(200):
    18     employ_lst.append(Employee('alex',i,'male','python'))
    19 for i in range(200):
    20     employ_lst.append(Employee('wusir', i, 'male', 'python'))
    21 for i in range(200):
    22     employ_lst.append(Employee('taibai', i, 'male', 'python'))
    23 employ_set=set(employ_lst)  # set集合的内容是可哈希的,会触发__hash__
    24 for el in employ_set:
    25     print(el.__dict__)
    26 # set集合去重机制:先调用hash,再调用eq。eq不是每次都触发,只有hash值相等的时候

    【set去重机制】

    5、初始模块

    (1)模块的分类:

        内置模块:安装python解释器的时候跟着装上的那些方法

        自定义模块:你写的功能如果是一个通用的功能,那你就把它当成一个模块

        第三方模块/拓展模块:没在安装python解释器的时候安装的那些功能(site-packages文件)

      # 什么是模块?

        # 有的功能开发者自己无法完成,这样的话需要借助已经实现的函数/类来完成这些功能

        # 你实现不了的功能都由别人替你实现了

        # 别人写好的一组功能   文件夹/py文件/C语言编译好的一些编译文件

        # 模块的好处:①分类  管理方法;②节省内存;③提供更多的功能

      # 为什么要有模块?

      # 模块怎么用?在哪儿用?

    (2)模块的导入和使用

      import 模块名    一个模块不会被重复导入

      模块的使用:模块名.方法名      模块名.变量

    1 # 模块
    2 import my_module
    3 
    4 # 如何使用模块?
    5 def login():
    6     print("in my login")
    7 login() # in my login
    8 my_module.login()    # 这是一个登录函数 alex
    9 print(my_module.name)   # alex

    【导入一个模块的过程中发生了哪些事情?】

    (4)模块的重命名

      import my_module as m 重新命名为m

    (5)导入多个模块

    1 import os
    2 import sys
    3 import my_module

    【注意】

      ① 所有的模块导入都应该尽量放在文件的开头

      ② 模块的导入也是有顺序的:先导入内置模块,再导入第三方模块,最后导入自定义模块


    时间:2020-02-16   18:18:06

  • 相关阅读:
    《构建之法》第四章学习笔记
    《深入理解计算机系统》第四章学习笔记
    《构建之法》第三章学习笔记
    《深入理解计算机系统》第三章学习笔记
    《文献管理与信息分析》第二讲学习笔记
    《深入理解计算机系统》第二章学习笔记
    20179223《Linux内核原理与分析》第十二周学习笔记
    《从问题到程序》第三章学习笔记
    51nod1256乘法逆元
    51nod1212无向图最小生成树
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12316420.html
Copyright © 2020-2023  润新知