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

Kar*_*ara 120 python inheritance

我发现以下两项工作:

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

class Foo(object):
    def a(self):
        print "hello"
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*Foo 108

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

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>
Run Code Online (Sandbox Code Playgroud)

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>
Run Code Online (Sandbox Code Playgroud)

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

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


sle*_*ica 59

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

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

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

  • 有很多使用foo(object)的python 3代码:那只是一个惯例吗? (4认同)
  • @RFVenter它可能是应该在Python 2和3下运行的代码,在这种情况下,您需要显式地子类化对象,以使类在Python 2下的行为大致相同. (2认同)

N R*_*awa 17

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

例1.

class MyClass:
 pass
Run Code Online (Sandbox Code Playgroud)

例2.

class MyClass():
 pass
Run Code Online (Sandbox Code Playgroud)

例3.

class MyClass(object):
  pass
Run Code Online (Sandbox Code Playgroud)