带对象参数的类
我正在尝试把一些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__']
在Python2中,最好让所有的类都成为新式类。(不过为了向后兼容,标准库中还有很多类是经典类。)
一般来说,在这样的声明中
class Foo(Base1, Base2):
Foo
被声明为一个继承自基类Base1
和Base2
的类。
object
是Python中所有类的“母类”。它是一个新式类,所以从object
继承会让Table
成为新式类。