(一)python进阶之一切皆对象

本文深入解析Python中的对象概念,包括对象的定义、特征和操作。通过实例演示变量、函数、类如何成为对象,以及它们之间的关系。揭示type、object和class之间的内在联系。

python中一切皆对象

python中所看见的一切皆为对象,变量是对象,函数也是对象,类还是对象,你所写的整个代码,也是对象。


1.什么是对象?

一种好理解的方式:对象就是类的实例化
show you code:

# 输入
num = 1
print(type(num))
print(type(int))

# 输出
<class 'int'>
<class 'type'>

type() 可以查看对象的类型,对于变量a,它是int类的一个实例;对于int类,它是type类的一个实例
即:type->class->int

对于函数:

# 输入
def Dog(name):
    print("{}使劲的汪汪叫".format(name))

print(Dog("旺财"))
print(type(Dog))
print(type(None))
# 输出
旺财使劲的汪汪叫
None
<class 'function'>
<class 'NoneType'>

没有设定返回值,默认返回None,返回值NoneNoneType类 的一个实例;可以看出定义的Dog函数也是function类的一个实例

对于类:

# 输入
class Cat():
    print("喵喵")

print(type(Cat))
print(Cat.__base__)

# 输出
喵喵
<class 'type'>
<class 'object'>

定义的Cat类type类的一个实例,定义时没有显式继承别的类,但Cat类的基类默认为object类

所以请再次理解这句话:对象就是类的实例化


2.对象有哪些特征和操作?

对象有三个特征:
  • 身份: 作为对象的唯一标识,即内存地址,可用id()来查看。

  • 类型: 不同类型有不同的属性和方法,可用type()来查看,python有丰富的内置类型,后面的章节会逐一讲解。

  • 值: 内存中存放的具体数据。

这三者有什么联系?

来看下 a = 1这句代码,python会将数据1int类来封装,并用变量a指向它,即变量a保存的是数据1内存地址,这种方式也叫作引用


对象的通用操作有以下四个:
  • 1.赋值给一个变量,比如类的实例化

  • 2.可以添加到集合对象中:

# 输入
def say(name="neko"):
    print("你好,我叫{}".format(name))

class Person(object):
    def __init__(self):
        print("这是一个类")

obj_list = [say, Person]
for item in obj_list:
    print(item())

# 输出
你好,我叫neko
None
这是一个类
<__main__.Person object at 0x000001630EA99320>

对于最后一个输出,类实例化时会返回一个对象,print直接输出对象的内存地址。

  • 3.可以作为参数传递给函数

  • 4.可以作为函数的返回值,这也是装饰器的原理。

# 输入
def say(name="neko"):
    print("你好,我叫{}".format(name))

def decorator_func():
    print("要开始了哦!")
    return say
    
tom = decorator_func()
tom()
# 输出
要开始了哦!
你好,我叫neko

3.type、object和class的关系

结论先行:

  • 1.object类以及所有以object类为基类的派生类,均为type类的实例。

  • 2.object类为所有内置类以及外建类的最顶层基类。

  • 3.type类继承自object类。

  • 4.最绕的来了:type类能将自身实例化,也就是说type类是type类自身的实例

之前应该看得都挺爽,但看到第4点是不是有种要被type支配感觉,比如:
被type支配的感觉
诸君莫慌,粮草已到:
type_object_class
图中虚线指向表示实例,比如虚线从object类指向type类,表示object类是type类的实例。

实线指向表示继承,比如实线从str类指向object类,表示object类是str类的基类。

纵向来看,python中所有类大致分为三种,能自我实例化的type类自成一类,它能创建所有对象,也成称为元类;python内置类有很多,比如数值类int、float,序列类list、range、tuple,映射类dic等等,它们都继承object类;外建类的最顶级基类也为object类。

至此,请结合上图再把结论好好斟酌一下,关于第4点,可以想象下只有单个节点循环单链表,感觉挺像的…

用代码做下验证:

  • 1.object类以及所有以object类为基类的派生类,均为type类的实例
# 输入
class Cat():
    print("喵喵")

print("Cat的基类是{}".format(Cat.__base__))
print("Cat类是{}的实例!".format(type(Cat)))
print("object类是{}的实例!".format(type(object)))

# 输出
喵喵
Cat的基类是<class 'object'>
Cat类是<class 'type'>的实例!
object类是<class 'type'>的实例!
  • 2.object类为所有内置类以及外建类的最顶层基类。
# 输入
class Cat():
    print("喵喵")

print("Cat的基类是{}!".format(Cat.__base__))
print("list的基类是{}!".format(list.__base__))

# 输出
喵喵
Cat的基类是<class 'object'>!
list的基类是<class 'object'>!
  • 3.type类继承自object类。
# 输入
print("type类的基类是{}!".format(type.__base__))

# 输出
type类的基类是<class 'object'>!
  • 4.type类是type类自身的实例。
# 输入
print("type类是{}的实例!".format(type(type)))

# 输出
type类是<class 'type'>的实例!

如有疑问或发现有误,欢迎留言交流!

打完收工!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值