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

时间:2013-03-13 00:27:13

标签: python inheritance

我发现以下两项工作都是:

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

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

所有Python类都应该扩展对象吗?没有扩展对象有任何潜在的问题吗?

6 个答案:

答案 0 :(得分:103)

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

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

VS

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

多重继承的规则也是different,我甚至不会在这里总结。我见过的关于MI的所有好的文档都描述了新式的类。

最后,旧式类在Python 3中已经消失,而object的继承已经隐含了。所以,除非你需要对旧软件进行反向比较,否则总是喜欢新的样式类。

答案 1 :(得分:55)

在Python 3中,无论你是否自己这样说,类都会隐式地扩展object

在Python 2中,有old-style and new-style个类。要表示类是新式的,您必须从object显式继承。如果没有,则使用旧式实现。

您通常需要一个新式的课程。明确地从object继承。请注意,这也适用于旨在与Python 2兼容的Python 3代码。

答案 2 :(得分:15)

在python 3中,你可以用三种不同的方式创建一个类。在内部他们都是平等的(见例子)。无论你如何创建一个类,python 3中的所有类都继承自名为 object 的特殊类。类对象是python中的基础类,它提供了许多功能,如双下划线方法,描述符,super()方法,property()方法等。

示例1。

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?id=$1 [L]

示例2。

class MyClass:
 pass

示例3.

class MyClass():
 pass

答案 3 :(得分:2)

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

答案 4 :(得分:1)

正如其他答案所述,Python 3从对象的继承是隐式的。但是他们没有说明您应该做什么以及什么是惯例。

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

答案 5 :(得分:0)

在python3中没有差异,但在python2中,不扩展object会给你一个旧式的类;你想在旧式的课堂上使用新式的课程。