Skip to content

Instantly share code, notes, and snippets.

@techlarry
Created June 8, 2017 07:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save techlarry/b59bb992a75025cab63bedf1298fb63f to your computer and use it in GitHub Desktop.
Save techlarry/b59bb992a75025cab63bedf1298fb63f to your computer and use it in GitHub Desktop.

Python 高级

模块重新导入

模块导入: import xxx, from xxx import xxxx 增加路径

import sys
sys.path.append(path)

模块重新导入

from imp import reload
reload(module name)

02 模块循环导入问题

不可以循环导入,不能在模块之间相互调用

怎样避免循环导入:导入语句放在后面需要导入时再倒入,例如放在函数体内导入

03/04 ==与is的区别

== 判断值是否相等 Is id(a), id(b)是否相等,比较两个引用是否指向了同一个对象(引用比较)

05-07 深拷贝与浅拷贝

  • 浅拷贝是一个对象的顶层拷贝,拷贝了引用,并没有拷贝内容 = 就是浅拷贝
  • 深拷贝是对于一个对象所有层次的拷贝(递归)
import copy
c = copy.deepcopy(a)

copy.deepcopy深拷贝会把引用都拷贝出来(递归) copy.copy() 使用copy模块的copy功能的时候,它会根据当前拷贝的数据类型是可变类型还是不可变类型,有不同的处理方式:如果拷贝可变类型,只能识别第一层拷贝;如果拷贝不可变类型,是浅拷贝

08 不同进制的讲解

09 原码,反码,补码,进制的转换

有符号数和无符号数的概念 规则:把二进制数中的最高位(最左边的那位)用作符号位

对于有符号数,最高位被计算机系统规定为符号位(0为正,1为负) 对于无符号数,最高位被计算机系统规定为数据位

数字在计算机中,是用二进制补码的形式来保存的,因此-1+1需要按照补码进行相加才是正确的结果

1)如何计算补码? 正数:原码=反码=补码 负数:反码=符号位不变,其他位取反 补码=反码+1 溢出:越界 2) 从补码转回原码 负数补码转换原码的规则: 原码=补码的符号位不变,数据位取反,尾+1

进制的转换 bin, int, oct, hex

0b 二进制 0o八进制 0x十六进制

转换成十进制 int("",16/8/2)

10 位运算

把一个数的各位整体向左移动一个位,就变成原来的2倍

位运算的介绍

  • & 按位于
  • |按位或
  • ^按位异或
  • ~按位取反
  • <<按位左移 >>按位右移

位运算

  • 按位与: 全1才1否则0:只有对应的两个二进位均为1时,结果位才为1,否则为0
  • 按位或:有1就1: 只要对应的二个二进位有一个位1时,结果位就为1,否则为0
  • 按位异或:不同为1: 当对应的二进位不相同时,结果为1,否则为0

12 私有化

属性的名字前面加上下划线,属于私有属性,不能从外部调用的 方法:setNum(), getNum() 设置两个方法,一个设置属性,一个获取数据

  • xx: 公有变量
  • _xx: 单前置下划线,私有化属性或方法,from somemodule import * 禁止导入,类对象和子类可以访问
  • __xx__: 双前后下划线,用于名字空间的魔法对象或属性。例如:init
  • __xx: 双前置下划线,私有,无法在外部直接访问(名子重整所以访问不到)
  • xx_: 单后置下划线,用于避免与python关键词的冲突

通过name mangling (名字重整),目的是防止类意外重写基类的方法或者属性:__classname__privateatribute

13-15 属性property的使用

私有属性添加getter和setter方法

  class Money(object):
    def __init__(self):
      self.__money = 0
    def getMoney(self):
      return self.__money
    def setMoney(self, value):
      if isinstance(value, int):
        self.__money = value
      else:
        print("error:")
  1. 使用property,property(getNum, setNum)

注意点:

t.num到底是调用getNum()还是setNum,要根据实际的场景来判断,

  1. 如果是给t.num赋值,那么一定调用setNum()
  2. 如果是获取t.num的值,那么久一定调用getNum() property的作用:相当于把方法进行了封装,开发者在对属性设置数据的时候更方便。

@property装饰器

@property 成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用 1. 将方法转换为只读 2. 重新实现一个属性的设置和读取方法,可做边界判定

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment