所有 Python 类都应该扩展对象吗?

我发现了以下两种工作:

class Foo():
def a(self):
print "hello"


class Foo(object):
def a(self):
print "hello"

所有 Python 类都应该扩展对象吗? 不扩展对象是否存在潜在的问题?

58922 次浏览

是的,所有 Python 类都应该扩展(或者说子类,这里是 Python)对象。虽然通常不会出现严重的问题,但在某些情况下(如多重继承) ,这一点很重要。这也确保了与 Python3的更好兼容性。

在 Python3中,类隐式地扩展 object,不管您自己是否这样说。

在 Python 2中,有 旧式和新式类。要表明类是新样式的,必须显式地从 object继承。如果没有,则使用旧式实现。

您通常需要一个新样式的类。显式继承 object。注意,这也适用于希望与 Python2兼容的 Python3代码。

在 python3中没有区别,但是在 python2中,不扩展 object会给您一个旧样式的类; 您希望使用一个新样式的类而不是一个旧样式的类。

在 Python 2中,不继承 object将创建一个旧式类,这会导致 type给出不同的结果:

>>> class Foo: pass
...
>>> type(Foo())
<type 'instance'>

对。

>>> class Bar(object): pass
...
>>> type(Bar())
<class '__main__.Bar'>

此外,多重继承的规则是 与众不同,我甚至不会在这里总结。我看到的所有关于 MI 的好文档都描述了新样式的类。

最后,旧式类在 Python3中消失了,从 object继承已经变得隐式。因此,除非您需要与旧软件进行向后比较,否则总是更喜欢新样式类。

在 python3中,你可以用三种不同的方式创建一个类,并且在内部它们都是相等的(参见示例)。如何创建类并不重要,python3中的所有类都继承自称为 对象的特殊类。对象类是 python 中的基本类,它提供了许多功能,比如双下划线方法、描述符、 super ()方法、 property ()方法等。

例子一。

class MyClass:
pass

例子2。

class MyClass():
pass

例子3。

class MyClass(object):
pass

正如前面介绍的其他答案一样,Python3对对象的继承是隐式的。但是他们没有说明你应该做什么,什么是惯例。

Python3文档示例都使用以下风格,这是惯例,因此我建议您在 Python3中的任何未来代码中遵循这种风格。

class Foo:
pass

资料来源: https://docs.python.org/3/tutorial/classes.html#class-objects

例句:

类对象支持两种操作: 属性引用 和实例化。

属性引用使用用于所有属性的标准语法 在 Python 中引用: objec.name 时在类的命名空间中的名称 所以,如果类定义看起来像这样:

class MyClass:
"""A simple example class"""
i = 12345


def f(self):
return 'hello world'

另一句话:

一般来说,实例变量用于每个 实例和类变量用于属性和方法 类的所有实例:

class Dog:


kind = 'canine'         # class variable shared by all instances


def __init__(self, name):
self.name = name    # instance variable unique to each instance