说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置 object() 函数返回一个空对象,不能向该对象添加新属性或方法。这个对象是所有类的基础,它拥有所有类默认的内置属性和方法。
它的语法如下:
o = object()
本函数不接受任何参数,作用是返回一个无特征的对象,它是所有类的基础。
更准确地说,它是 Python 的一个内置的可调用的类,我们在调用它时创建了一个基类的实例。
由于 object 没有 __dict__
,因此无法将任意属性赋给 object 的实例。
实例可以用于指示缓存未命中的唯一对象。
我们创建一个 object 的实例。
x = object()
type(x)
# <class 'object'>
dir(x)
'''
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
'__init__', '__init_subclass__', '__le__', '__lt__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__']
'''
x.a = 1
'''
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'a'
'''
在程序中,我们使用 type() 来获取对象的类型。
类似地,我们使用 dir() 来获取所有属性。这些属性(属性和方法)对于所有 Python 类的实例都是通用的。
我们无法向对象的实例添加属性。
它的用途:
哨兵值(Sentinel value)是一个特殊值(唯一),因为和所有其它值不同,所以可以作为区分其它值得标记。
可以理解为它是一个唯一的占位符值,在 Python 程序中对一些事情很有用,例如函数参数的默认值,其中没有一个是有效的输入值。
object() 的实例,在其它任何地方都不会出现,不会出现重复的可能:
>>> x = object()
>>> o = object()
>>> o is x
False
>>> o == x
False
因些很多场景下用它做缺失值(MISSING)的替代。我们看这样的一个例子:
sentinel = object() # 用于指示缓存未命中的唯一对象
result = cache_get(key, sentinel)
if result is not sentinel:
...
在缓存函数 functools.lru_cache()
中,隐藏在闭包内部的是一个完全独特的对象,它为缓存的每个单独实例分别创建。
还有在字典的 get 方法中,我们可以指定不存在的 key 的默认值:
val = mydict.get("some_key", None)
但 mydict 中有可能它的值就是 None,如果换成其他值也有可能是我们换的其他值,那如何彻底解决这个问题呢?
MISSING = object()
val = mydict.get(key, MISSING)
if val is MISSING:
...
MISSING 不会与其他任意值是同一个对象,不存在重复的可能。
更新时间:May 16, 2022, 11:03 a.m. 标签:python object 函数