python笔记整理-1. 类和对象

1.1 快速掌握

  • 在python里一切皆为对象,包括基本类型,甚至包括类本身.切记切记
  • 而对象就是指向它在内存中所处位置的指针
  • 创建对象的过程也就是把一个类型实例化,一旦被实例化,则不可改变类型了,对象的值可以是可修改的,也可以是不可修改的.
  • 用.可以访问实例的属性或者方法,先从实例查找,再从类里查找
  • 身份和类型
  • id可以得到一个整型的值,表示唯一的对象的身份
  • type可以得到对象的类型
  • isinstance 可以比较对象的类型,可以向上检查,也就是说适用于继承之后的检查,但是影响性能

1.2 引用

  • del一个对象的时候,是减少引用次数,那么下面的方法都是可以的
a=37 # 创建值为37的对象
b=a # 增加引用
c = [] c.append(b) # 增加引用
del a # 减少引用
b=42 # 减少引用
c[0]=2 # 减少引用
  • 用sys.getrefcount()可以获得引用计数
a=37
import sys
sys.getrefcount(a)
7
  • 对于不可变对象,引用的是一个副本,对可变对象引用的是同一个对象
a = [1,2,3,4]
b=a
b is a # True
b[2]=-100
a # [1,2,-100,4]
  • 所以对于字典和列表可以有浅拷贝和深拷贝,浅拷贝可以增加新的值,不影响原来的对象比如
a=[1,2,[3,4]]
b=list(a)
b is a # False
b.append(100)
b # [1,2,[3,4],100] #这个时候注意a不变
a # [1,2,[3,4]]
b[2][0] = -100 #但是如果我们改变原来元素里的一个可变对象
b # [1,2,[-100,4],100]
a # [1,2,[-100,4]]
  • 如果使用深拷贝,将创建一个新的对象了
import copy
a = [1,2,[3,4]]
b = copy.deepcopy(a)
b[2][0]=-100
b # [1,2,[-100,4]]
a # [1,2,[3,4]]

1.3 第一类对象

python里所有的一切都是第一类对象,也就是说所有可以命名的对象都可以当做数据来处理

具体怎么理解呢,举2个例子

例子1

class HelloWord(object):

def __init__(self):
print('init HelloWord')

def __call__(self):
print('call HelloWord')

def do_something(self):
print('do something')

if __name__ == '__main__':
hwc = HelloWord()
hwc()

hwc2 = HelloWord
hwc2()

ds1 = hwc.do_something
ds1()

类,方法本身都可以当做值来传递,都可以调用

例子2

items = {
'number': 43,
'text': 'hkahdasd'
}

items['func'] = abs
import math

items['mod'] = math

items['error'] = ValueError
nums = [1,2,3,4]
items['append'] = nums.append

这个例子里,item字段里包含了函数,模块,异常,另一对象的方法,这样调用都是可以的

items['func](45) # 45
items['mod'].sqrt(4) # 2.0

1.4 表示程序结构的内置类型

在python里 函数,类,模块都可以当做数据操作对象

1.4.1 函数

函数具有以下属性

f.__doc__ # 文档字符串
f.__name__ #函数名称
f.__dict__ #函数中其它属性的字典
f.__code__ # 字节编译的代码
f.__defaults__ # 包含默认参数的元祖
f.__globals__ # 定义全局命名空间的字典
f.__closure__ # 包含与嵌套作用域相关数据的元祖

1.4.2 方法

方法是在类中定义的函数,主要有类方法,实例方法,

  • 静态方法和类以及实例都没有关系,只是打包在类中
  • 实例方法是操作指定类的实例的方法,实例作为第一个参数传递给方法,一般是self
  • 类方法把类本身作为第一个参数(通常是cls)传递.

方法包含的属性

m.__doc__ # 文档字符串
m.__name__ #函数名称
m.__class__ # 定义方法的类
m.__func__ # 实现方法的函数对象
m.__self__ # 与方法相关的实例

1.4.3 类,类型与实例