ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

02 对象介绍

在Python中,一切皆为对象。

对象与类的关系

​ 对象就是其类型的实例,创建对象就是对该类(class)进行实例化(instance)。实例被创建后,其身份id和类型type就不可再被改变,值根据是否为可变对象而定。

如何创建对象

​ 对象创建使用对象定义表达式(如列表[])或工厂函数(如set())创建。这些表达式和工厂函数决定了创建和使用的对象的类型。

# 对象定义表达式
li=[1,2,3]
s=set(>>> li=[1,2,3]
>>> li
[1, 2, 3]

# 工厂函数
>>> s=set(li)
>>> s
{1, 2, 3})

​ 一旦创建了一个对象,对象的类型就确定了,那么它就和特定操作集合绑定了,例如对字符串只可以进行字符串相关的操作,对列表只可以进行列表相关的操作。

可变对象与不可变对象

​ 在Python中,每一个对象都可以分为不可变对象或可变对象。

  • 不可变对象:对象的值是不可修改的。主要有:数值型、字符串、元组。对象这种不可变性可以用来保证在程序中保持一个对象固定不变。

  • 可变对象:对象的值是可以修改的,可以在内存原处修改,此处注意“可变”指的是对象的值而不是变量的值。主要有:列表和字典

    这里要理解指向不可变对象的变量重新赋值的操作:例如str1=’aa’,我们重新赋值str1=’bb’,因为字符串是不可变对象

    判断某个对象是否为某个类实例化而来:isinstance(obj,class),如果obj为class实例化而来,返回Ture,否则返回False。例如:isinstance(“hello”,str)返回True。

对象的特征

Python程序中存储的所有数据都是对象,每个对象都有一个身份,一个类型,一个值。

  • 身份:id()获取,身份是指向对象在内存中所处位置的指针(其在内存中的地址),注意变量名就是引用这个具体位置的名称(变量名引用对象的过程)

  • 类型:type()获取,也称之为“类别”。对象的类型决定了它所能够支持的方法和能够参与的操作。这个特性说明了Python是一种强类型语言(bash是弱类型语言,默认所有的变量类型为字符串);

>>> s="hello"
>>> id(s)
4305113776
>>> type(s)
<class 'str'>
>>> s
'hello'
>>>

两个对象的比较

  • 值比较:num1 == num2

  • 身份比较:num1 is num2,两个变量名是否引用的时同一个对象(内存地址是否相等)。

  • 类型比较:type(num1) is tpye(num2),比较两个对象的类型是否相同。

对象的属性与方法

大多数对象都拥有大量的"数据属性"和"方法"

  • 属性:与对象相关的值。对象是由类实例化而来,在实例化时(创建对象时),会给对象内部变量进行赋值,这些内部的可用变量就是对象的属性。

  • 方法:指被调用时将在对象上执行某些操作的函数。方法就是与特定的对象相关联在一起的函数。

属性和方法的访问需要使用点运算符,函数被调用时使用括号运算符。

​ 调用属性,返回属性数据,显示一般需要使用print()

​ 调用方法,需要使用括号运算符(),执行一段代码操作

对象缓存和复用的机制

python中,小的整数字符串对象会被缓存并复用。

>>> a=3
>>> id(a)
15105080
>>> b=3
>>> id(b)
15105080
>>> a is b
True

上例说明:“3"这个对象被缓存并复用了,同时赋值给了变量a和b。

>>> a=999
>>> b=999
>>> a is b
False

对象的引用(内存管理)

所有对象都有引用计数,当引用计数为0时,垃圾收集器会销毁。使用sys.getrefcount(对象名)查看此对象的引用计数。

增加对象的引用计数场景:

  • 对象创建时

  • 将对象添加进容器是:类似list.append()

  • 当对象被当作参数传递给函数时。

  • 为对象创建另外的变量名:多重目标赋值时s3=s2=s1=‘abc’

减少引用计数的场景:

  • 引用此对象的某变量名被显示销毁:del x
  • 引用此对象的某变量名被设定为引用了其他对象(此变量名重新赋值)
  • 从容器中移除对象时,类似list.pop()
  • 容器本身被销毁

对象的垃圾收集

​ 自动回收对象内存空间的技术,被回收的空间被放入自由内存空间池,等待后来的对象使用。

​ 在内部,Python是这样来实现这一功能的:它在每个对象中保持了一个引用计数器,计数器记录了当前指向该对象的引用的数目。一旦(并精确在同一时间)这个计数器被设置为零,这个对象的内存空间就会自动回收。垃圾收集最直接的好处就是,可以在python脚本中任意使用对象而不需要考虑释放内存空间。在程序运行时,Python将会清理那些不再使用的空间。实际上,与C和C++这样的底层语言相比,省去了大量的基础代码。