137

我发现以下两项工作:

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

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

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

4

6 回答 6

125

在 Python 2 中,不继承自object将创建一个旧式类,除其他效果外,它会导致type给出不同的结果:

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

对比

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

此外,多重继承的规则也有所不同,我什至不会在这里总结。我看到的所有关于 MI 的优秀文档都描述了新式类。

最后,旧式类在 Python 3 中消失了,继承object变得隐含。因此,除非您需要与旧软件向后兼容,否则总是更喜欢新样式的类。

于 2013-03-13T00:31:29.893 回答
74

object在 Python 3 中,无论你自己是否这么说,类都是隐式扩展的。

在 Python 2 中,有旧式和新式的类。要表明一个类是新式的,你必须显式地继承自object. 如果不是,则使用旧式实现。

你通常想要一个新式的课程。显式继承object。请注意,这也适用于旨在与 Python 2 兼容的 Python 3 代码。

于 2013-03-13T00:29:55.510 回答
17

在 python 3 中,您可以通过三种不同的方式创建一个类,并且它们在内部都是相等的(参见示例)。不管你如何创建一个类,python 3 中的所有类都继承自名为 object的特殊类。类对象 是python中的基础类,提供了很多功能,如双下划线方法、描述符、super()方法、property()方法等。

示例 1。

class MyClass:
 pass

示例 2。

class MyClass():
 pass

示例 3。

class MyClass(object):
  pass
于 2016-06-16T11:57:23.237 回答
1

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

于 2013-03-13T00:29:15.430 回答
1

正如其他答案所涵盖的那样,Python 3 从 object 继承是隐式的。但他们没有说明你应该做什么以及什么是约定。

Python 3 文档示例都使用以下约定样式,因此我建议您在 Python 3 中的任何未来代码中都遵循此样式。

class Foo:
    pass

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

引用示例:

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

属性引用使用 Python 中所有属性引用的标准语法:obj.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
于 2020-03-17T07:26:53.830 回答
0

在 python3 中没有区别,但在 python2 中,不扩展object为您提供了旧式类;您想在旧式课程上使用新式课程。

于 2013-03-13T00:30:09.670 回答