2011-09-11 41 views
63

我试图将一些python代码转换为scala代码。所以我是一个Python的总noob。以对象作为参数的类

但为什么有些类有对象作为参数,但从来没有明确使用它?首先将它作为参数的理由是什么?

例子:

class Table(object) 

谢谢您的时间。

+0

[Python中的旧风格和新风格类]可能的重复(http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python) – JBernardo

回答

68

在Python2中,它声明Tablenew-style class(与“经典”类相对)。 在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__'] 

此外,propertiessuper不与经典类的工作。

在Python2中,创建所有类的新样式类是一个不错的主意。 (虽然在标准库大量类仍然经典类,向后兼容的需要。)

通常,在诸如

class Foo(Base1, Base2): 

Foo被声明为类声明中继承自基类Base1Base2

object是Python中所有类的母亲。这是一种新式的课程,因此从object继承,使Table成为一种新式课程。

+0

你可以将我重定向到一个源,提到对象是不必要的参数在Python3中?我似乎无法找到它。谢谢 –

+1

在StackOverflow([这里,例如](https://stackoverflow.com/a/16193572/190597))上已经提到过很多次,但是我一直没有能够在文档。它隐含地显示出来了(通过在类的基础列表中省略'object')[在教程中](https://docs.python.org/3/tutorial/classes.html#class-definition-syntax)。 – unutbu

+1

[Python3文档](https://docs.python.org/3/glossary.html#term-new-style-class)也声明“新风格类”是“风格的旧名称”类**现在用于所有类对象**“(我强调)。并且[Python2文档状态](https://docs.python.org/2/glossary.html#term-new-style-class)“新风格的类”是从“object”继承的任何类。这两个语句放在一起意味着你不需要在Python3的类库列表中包含'object',因为所有的类都是Python3中的新类。 – unutbu

14

Table该课程正在扩展名为object的课程。这不是一个争论。你可能想明确地扩展object的原因是它把这个类变成了一个新风格的类。如果你没有明确指定它扩展为object,直到Python 3,它将默认为一个旧式类。 (从Python 3开始,所有类都是全新的,无论您是否明确地扩展了object)。

有关新式和旧式类的更多信息,请致电see this question

+1

这是更多简洁明了的答案。谢谢。 – Sabuncu

2

class Table和class Table(object)对于Python来说没有什么不同。

它不是一个参数,它是从对象(与许多其他语言一样是基类)扩展而来的。

它所说的只是它继承了“对象”中定义的任何东西。这是默认行为。

+3

自动扩展'object'的类只是Python 3中的默认行为。在python 2中,类扩展对象具有一个不扩展对象的类不会拥有的属性。 –

1

刚一说明,“新风格”与‘旧风格’的等级区分是针对Python 2.x的;在3.x中,所有的类都是‘新式’

0

1)。类名(object):2)类名: 它们都是相同的,但在写作方面第一个更好,在继承其他类到另一个类时它看起来更好,它看起来是同类的。

如何相同? 所以,Python中的每一件事都是在对象的意义下意味着Python中的每一件事物都具有对象的属性,如果写或不理解它。首先,我们明确地告诉它,其次我们不知道。

+0

Python 2中不是这种情况,请参阅接受的答案以了解详细信息。 – niemmi

0

对象是python中定义的类对象的最基类型。对象的属性 可以看出如下

** >>> DIR(对象)

[ '', 'delattr', 'DOC', '格式' '的getAttribute', '哈希', '初始化', '', '减少','reduce_ex ' '再版', 'SETATTR', '的sizeof', 'STR',' subclasshook“] **

所以表(对象)是刚刚继承。 !