python的class(类)中的object是什么意思?

本文通过对比带有object基类和不带object基类的Python类,解释了二者之间的区别。在Python 2.x中,带有object的类会拥有更多内置属性和方法,提供了额外的功能性和灵活性。而在Python 3.x中,默认所有类都继承自object。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那写object和不写object有什么区别?

好的,再用代码来理解它们的区别.

# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'


class Person:
    """
    不带object
    """
    name = "zhengtong"


class Animal(object):
    """
    带有object
    """
    name = "chonghong"

if __name__ == "__main__":
    x = Person()
    print "Person", dir(x)

    y = Animal()
    print "Animal", dir(y)

 

运行结果

Person ['__doc__''__module__''name']
Animal ['__class__''__delattr__''__dict__''__doc__''__format__''__getattribute__''__hash__''__init__''__module__''__new__''__reduce__''__reduce_ex__''__repr__''__setattr__''__sizeof__''__str__''__subclasshook__''__weakref__''name']

 

 

Person类很明显能够看出区别,不继承object对象,只拥有了__doc__ , __module__ 和 自己定义的name变量也就是说这个类的命名空间只有三个对象可以操作.

Animal类继承了object对象,拥有了好多可操作对象,这些都是类中的高级特性。

 

对于不太了解python类的同学来说,这些高级特性基本上没用处,但是对于那些要着手写框架或者写大型项目的高手来说,这些特性就比较有用了,比如说tornado里面的异常捕获时就有用到__class__来定位类的名称,还有高度灵活传参数的时候用到__dict__来完成.

 

最后需要说清楚的一点, 本文是基于python 2.7.10版本,实际上在python 3 中已经默认就帮你加载了object了(即便你没有写上object)。

 

这里附上一个表格用于区分python 2.x 和 python 3.x 中编写一个class的时候带上object和不带上object的区别.

python 2.xpython 2.xpython 3.xpython 3.x
不含object含object不含object含object
__doc____doc____doc____doc__
__module____module____module____module__
say_hellosay_hellosay_hellosay_hello
 __class____class____class__
 __delattr____delattr____delattr__
 __dict____dict____dict__
 __format____format____format__
 __getattribute____getattribute____getattribute__
 __hash____hash____hash__
 __init____init____init__
 __new____new____new__
 __reduce____reduce____reduce__
 __reduce_ex____reduce_ex____reduce_ex__
 __repr____repr____repr__
 __setattr____setattr____setattr__
 __sizeof____sizeof____sizeof__
 __str____str____str__
 __subclasshook____subclasshook____subclasshook__
 __weakref____weakref____weakref__
  __dir____dir__
  __eq____eq__
  __ge____ge__
  __gt____gt__
  __le____le__
  __lt____lt__
  __ne____ne__
<think>我们正在讨论Python的继承机制,特别是默认继承的object。根据用户的问题,我们需要回答两个主要问题: 1. Python默认是否继承object? 2. object的作用是什么? 首先,我们注意到Python 2和Python 3在的定义上有重要区别。因此,我们需要分别说明两个版本的情况。 根据引用[2]和[5]: 在Python 2.x中,有两种风格的: - 旧式(经典):不继承object。 - 新式:直接或间接继承object。 在Python 2.x中,默认是不继承object的,因此默认是旧式。但是,我们可以显式地继承object来创建新式。 在Python 3.x中,旧式已经被移除,所有都是新式。也就是说,即使我们不显式地写继承objectPython 3也会自动让继承object。因此,在Python 3中,写不写`(object)`没有区别。 关于object的作用: - 新式引入了许多新的特性和改进,比如: - 使用`super()`函数来更安全地调用父方法。 - 属性描述符(property)的完整支持。 - 能够使用`__slots__`来减少内存占用。 - 新的方法解析顺序(MRO),采用C3算法,解决多继承中的菱形继承问题。 - 提供了许多特殊方法(如`__new__`、`__init_subclass__`等)以及元编程的支持。 在引用[1]中提到,在Python 2中,经典(旧式)和新式在多继承调用顺序上有差异:经典按照深度优先,而新式遵循广度优先(C3 MRO)。 另外,引用[3]和[4]也提到,在Python 3中,即使不显式写`object`,也会自动继承,所以为了编写同时兼容Python 2和3的代码,在Python 2中应该显式继承object。 总结回答: 1. Python默认是否继承object? - 在Python 2中,默认不继承object(即旧式),需要显式继承object来创建新式。 - 在Python 3中,默认继承object(即所有都是新式),因此写不写`(object)`都可以。 2. object的作用是什么? - 继承object使得成为新式,从而可以使用新式的特性,包括: - 更先进的方法解析顺序(MRO),解决多继承问题。 - 支持描述符(如property,方法,静态方法等)。 - 支持`__slots__`属性来优化内存。 - 提供更多的内置方法(如`__new__`、`__init_subclass__`等)和元支持。 - 使用`super()`函数更安全地调用父方法。 最后,根据要求,我们需要生成相关问题。 注意:在回答中,我们引用了多个引用,需要在引用的段落末尾添加引用标识。</think>### Python的继承机制与`object`的作用 #### 1. Python默认是否继承`object`? - **Python 2.x**: 默认**不继承**`object`,此时称为**经典**(旧式)。 示例: ```python class Foo: # 经典 pass ``` 可通过显式继承`object`创建**新式**: ```python class Bar(object): # 新式 pass ``` - **Python 3.x**: 所有**默认隐式继承**`object`,均为新式[^5]。 示例: ```python class Foo: # 自动继承object pass ``` 等价于显式声明: ```python class Foo(object): pass ``` #### 2. `object`的作用是什么? 继承`object`使成为**新式**,主要带来以下优势: 1. **方法解析顺序(MRO)优化** - 经典:多继承时按**深度优先**搜索父方法。 - 新式:采用**C3算法**(广度优先),解决菱形继承问题[^1][^2]。 示例: ```python class A(object): pass class B(A): pass class C(A): pass class D(B, C): pass print(D.__mro__) # 输出: (D, B, C, A, object) ``` 2. **支持高级特性** - 描述符协议(如`@property`、`@classmethod`)。 - `__slots__`属性(优化内存占用)。 - `super()`函数(安全调用父方法)[^3][^5]。 3. **型系统统一** - 经典实例型为`<type 'instance'>`。 - 新式实例型为`<class '__main__.ClassName'>`,与内置型一致[^5]。 4. **元编程支持** 新式可通过`__new__`方法控制实例创建过程,支持元(`metaclass`)定制[^4]。 #### 3. 兼容性建议 - 在**Python 2**中显式继承`object`以确保新式行为。 - 在**Python 3**中无需显式声明,但为兼容跨版本代码可保留`(object)`[^3]。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值