新知榜官方账号
2023-08-12 10:10:59
作为高级编程语言的Python,在使用其编程时,一条核心基本的原则要记牢,即Python世界一切皆对象。而Python编程即操作各种类型的对象(Object)来完成相关任务。Python提供了很多的内置类,除了基本的整数类型、浮点类型、字符串类型、布尔类型外,还有容器型或说集合形类型,如列表、元组、集合以及其它相关特定内置等。另外,我们还可以使用类(class)类创建自己的数据类型。在拥有一定的Python编程知识后,还应该深入的理解底层的Python对象模型和对象工作的机制。随着编程的深入,还要特别注意定义各种对象的核心行为的“协议”(protocols)。本文主要内容是关于对象的基本概念以及对象标识和类型,有一定编程知识则易理解。
Python存储在程序中的每一块数据都是一个对象。每个对象都有一个标识(identity)、一个类型(也称为类-class)和一个值。例如,即便我们简单地编写a=42则此语句也会创建一个值为42的整数对象。对象的标识是表示其在内存中的位置的数字(可以简单地理解为内存地址)。而a则是一个指向这个特定位置的标签(便于编程和识别的对象名称,简单理解为变量名),要知道的是:该标签不是对象本身的一部分,只是一个名称(变量名称)。对象的类型(type),也称为对象的类,其定义了对象的内部数据表示以及受支持的方法。当创建特定类型的对象时,该对象称为该类型的“实例”(instance)。创建实例后,其标识是不会改变的。如果一个对象的值可以被修改,那么这个对象就被称为可变的(mutable)。如果值不能被修改,则称该对象为不可变的(immutable)。通常持有对其他对象的引用的对象称为容器(container)。对象是由它们的属性(Attributes)来表征化描述体现的。属性是与对象有关的值,可通过对象的点运算符(.)来访问使用点(即访问的对象相关的值)。属性可以是一个简单的数据值,比如一个数字,也可以是其他对象。属性还可以是用于执行某些操作的函数。这样的函数常被称为方法(method)。请看下面的例子,来进一步理解对属性的访问:
a=34 #创建一个整数对象
n=a.numerator #获取属性numerator(整数的一个属性)
b=[1,2,3] #创建一个列表对象
b.append(7) #使用列表对象的append方法添加新元素
对象还可以实现各种操作符(operators)运算,比如+操作符。例如:
c=a+10 #或复数
c=13+4j
d=b+[4,5] #d=[1,2,3,4,5]
尽管操作符使用不同的语法,但它们最终会映射到方法。例如,写a+10则对应执行整数对象的a.__add__(10)方法实现加法运算。注意:带有前后下划线的方法,通常是Python的约定,为内置方法,通常很少直接调用。
本小节中提到的基本概念,在文中都加粗标识了,将贯穿Python编程的整个过程。
Python内置函数id()用于返回对象的唯一标识。该标识符是一个整数,通常对应于对象在内存中的位置。is和is not操作符用于比较两个对象的标识是否一样(同一个对象)。Type()返回对象的类型。还有一个等号(==)对象比较方式需要注意。看下面示例,用于比较两个对象的不同方法:
#对象比较
a=[1,2,3]
b=[1,2,3]
if a is b:
print('a和b是同一对象。')
else:
print('a和b不是同一对象。')
if a==b:
print('a和b的值相同。')
else:
print('a和b的值不相同。')
if type(a)==type(b):
print('两个对象的类型相同:{}。'.format(type(a)))
if isinstance(a,list):
print('a是list类型。')
#输出结果为:
#a和b不是同一对象。
#a和b的值相同。
#两个对象的类型相同:<class 'list'>。
#a是list类型。
两个对象的类型本身就是一个对象,称为对象的类(class)。该对象是唯一定义的,对于给定类型的所有实例总是相同的。类通常特定名称(例如,list,int,dict等),其用于创建相应实例、执行类型检查和类型提示。例如:
items=list()
item=123
if isinstance(items,list):
items.append(item)
def removeall(items:list,item)->list:
return [i for i in items if i!=item]
“子类型”(subtype)是由继承而定义的类型。它包含了原始类型/父类型的所有特性,外加新增的和/或重新定义的方法(OOP的抽象、封装、继承和多态等特性则会另行介绍)。为便于理解,这里通过继承简单定义了list的子类型并向其添加新方法,示例如下:
class myList(list):
def removeAll(self,val):
return [i for i in self if i!=val]
#简单应用
items=myList([5,8,2,7,2,13,9])
x=items.removeall(2)
print(x)#输出结果为:[5,8,7,13,9]
if isinstance(items,list):
print(f'{type(items)}是list的子类。')#<class '__main__.myList'>是list的子类。
isinstance(instance,type)函数是根据类型检查值的首选方法,它可以识别子类型。它还可以检查许多可能的类型,如:
if isinstance(items,(list,tuple)):
maxval=max(items)
最后提醒一下:类型检查通常没有你想象的那么有用。首先,过多的检查会影响性能。其次,程序并不总是定义符合良好类型层次结构的对象。例如,如果上面的isinstance(items,list)语句的目的是测试items是否为“类似列表”,那就不能用于具有与列表相同编程接口,但不直接继承内置列表类型的对象(例如来自collections模块的deque实例,虽然接口一样,但类型不一样,所以不能用统一模式写代码)。
最后简单总结一下:基于Python编程中“一切则对象”的原则,简要介绍了对象相关的基本概念构成(类型、类、实例、属性、方法、标识、可变性等),以及对象的相关标识和比较方法。本篇就介绍这么些了,欢迎转发、留言,下次见。
微信扫码咨询
相关工具
相关文章
相关快讯
推荐
阿里Accio中文版上线!一键搞定复杂采购
2025-08-19 09:13
视频“用嘴编辑”的时代来了,但钱包顶得住吗?
2025-08-15 17:59
智谱新模型GLM-4.5V全面开源,玩家们有福啦!
2025-08-12 17:56
扎心文案+AI插画=爆款!揭秘8万赞视频的制作全流程
2025-08-12 10:08
GPT-5没你想的那么好,附实测体验~
2025-08-11 11:07
一站式搞定AI绘图+视频,AI短片效率飙升的秘密在这儿!
2025-08-08 09:26
打工人新神器!10款国产AI,让你告别996!
2025-08-08 09:24
豆包视觉推理深度体验,AI也能“边看边想”了!
2025-08-08 09:19
300美元的AI男友来了!马斯克的情感生意从女友做到男友
2025-08-01 17:56
Agent智能体:2025年企业新员工,月薪仅需一度电?
2025-07-30 17:49