我发现以下两项工作都是:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
所有Python类都应该扩展对象吗?没有扩展对象有任何潜在的问题吗?
答案 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
会给你一个旧式的类;你想在旧式的课堂上使用新式的课程。