带对象参数的类

154 投票
6 回答
106628 浏览
提问于 2025-04-17 02:00

我正在尝试把一些Python代码转换成Scala代码,所以我对Python完全是个新手。

但是为什么有些类的参数中有一个叫做object的东西,却从来没有明确使用过它呢?这样做的理由是什么呢?

举个例子:

class Table(object)

谢谢你的时间。

6 个回答

4

在Python中,class Table和class Table(object)是没有区别的。

这里不是在说什么参数,而是说它是从object这个类扩展出来的(就像其他很多编程语言中的基类)。

这句话的意思是,它会继承“object”里面定义的所有东西。这是Python的默认行为。

37

Table类是从一个叫object的类继承而来的。这不是一个参数。你可能想要明确地继承object的原因是,这样可以把这个类变成一个新式类。如果你不明确指定它继承object,在Python 3之前,它默认会变成一个旧式类。(从Python 3开始,所有类都是新式类,无论你是否明确继承object。)

想了解更多关于新式类和旧式类的信息,可以查看这个问题

152

在Python2中,这段代码声明了Table是一个新式类(与“经典”类相对)。在Python3中,所有的类都是新式类,所以不再需要这样做。

新式类有一些经典类没有的特殊属性。

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

而且,属性super在经典类中是无法使用的。

在Python2中,最好让所有的类都成为新式类。(不过为了向后兼容,标准库中还有很多类是经典类。)

一般来说,在这样的声明中

class Foo(Base1, Base2):

Foo被声明为一个继承自基类Base1Base2的类。

object是Python中所有类的“母类”。它是一个新式类,所以从object继承会让Table成为新式类。

撰写回答