【问题标题】:Class with Object as a parameter以 Object 为参数的类
【发布时间】:2017-12-06 14:25:37
【问题描述】:

我正在尝试将一些 python 代码转换为 scala 代码。所以我完全是 Python 的菜鸟。

但是为什么有些类有对象作为参数却从不显式使用呢?首先将其作为参数的原因是什么?

例子:

class Table(object)

感谢您的宝贵时间。

【问题讨论】:

标签: python


【解决方案1】:

在 Python2 中,这将 Table 声明为 new-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 一个新式类。

【讨论】:

  • 你能把我重定向到一个提到对象在 Python3 中不需要作为参数的来源吗?我似乎找不到它。谢谢
  • 在 StackOverflow (here, for instance) 上多次提到它,但我无法在文档中找到一个简单的声明。它被隐式显示(通过从类基列表中省略objectin the tutorial
  • Python3 docs 还声明“新式类”是“类风格的旧名称现在用于所有类对象”(我的重点) .而the Python2 docs state,“新式类”是任何继承自object 的类。这两个语句放在一起意味着您不需要在 Python3 的类库列表中包含 object,因为所有类都是 Python3 中的新型类。
【解决方案2】:

Table 类扩展了一个名为 object 的类。这不是争论。您可能想要显式扩展object 的原因是它将类变成了一种新型类。如果您没有明确指定它扩展 object,直到 Python 3,它将默认为旧样式类。 (从 Python 3 开始,无论您是否明确扩展 object,所有类都是新样式的。)

有关新式和旧式课程的更多信息,请see this question

【讨论】:

  • 这是更直接和简洁的答案。谢谢。
  • 良好而准确的答案。
【解决方案3】:

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

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

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

【讨论】:

  • 类自动扩展 object 仅在 Python 3 中是默认行为。在 python 2 中,类扩展对象具有不扩展对象的类所没有的属性。
【解决方案4】:

请注意,“new-style”与“old-style”类的区别是 Python 2.x 特有的;在 3.x 中,所有类都是“new-style”。

【讨论】:

    【解决方案5】:

    object 是python中定义的最基本的类对象类型。 对象的属性如下图所示

    **>>> 目录(对象)

    ['class', 'delattr', 'doc', 'format', 'getattribute', 'hash', 'init', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', '子类挂钩']**

    所以 Table(object) 只是继承。!

    【讨论】:

      【解决方案6】:

      1)类名(对象):2)类名: 两者都是一样的,但是第一个写的更好,继承其他类的时候看起来更好,看起来是同质的。

      怎么一样? 因此,Python 中的每一件事都属于对象,这意味着 Python 中的每一件事都具有对象的属性,不管写不写它都会理解它。 一开始我们明确告诉它,第二次我们没有。

      【讨论】:

      • 在 Python 2 中不是这种情况,详情请参阅接受的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 2021-06-08
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      相关资源
      最近更新 更多