我发现以下两项工作:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
所有 Python 类都应该扩展对象吗?不扩展对象是否有任何潜在问题?
我发现以下两项工作:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
所有 Python 类都应该扩展对象吗?不扩展对象是否有任何潜在问题?
在 Python 2 中,不继承自object
将创建一个旧式类,除其他效果外,它会导致type
给出不同的结果:
>>> class Foo: pass
...
>>> type(Foo())
<type 'instance'>
对比
>>> class Bar(object): pass
...
>>> type(Bar())
<class '__main__.Bar'>
此外,多重继承的规则也有所不同,我什至不会在这里总结。我看到的所有关于 MI 的优秀文档都描述了新式类。
最后,旧式类在 Python 3 中消失了,继承object
变得隐含。因此,除非您需要与旧软件向后兼容,否则总是更喜欢新样式的类。
object
在 Python 3 中,无论你自己是否这么说,类都是隐式扩展的。
在 Python 2 中,有旧式和新式的类。要表明一个类是新式的,你必须显式地继承自object
. 如果不是,则使用旧式实现。
你通常想要一个新式的课程。显式继承object
。请注意,这也适用于旨在与 Python 2 兼容的 Python 3 代码。
在 python 3 中,您可以通过三种不同的方式创建一个类,并且它们在内部都是相等的(参见示例)。不管你如何创建一个类,python 3 中的所有类都继承自名为 object的特殊类。类对象 是python中的基础类,提供了很多功能,如双下划线方法、描述符、super()方法、property()方法等。
示例 1。
class MyClass:
pass
示例 2。
class MyClass():
pass
示例 3。
class MyClass(object):
pass
是的,所有 Python 类都应该扩展(或者更确切地说是子类,这里是 Python)对象。虽然通常不会出现严重的问题,但在某些情况下(如多重继承树),这将很重要。这也确保了与 Python 3 更好的兼容性。
正如其他答案所涵盖的那样,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
在 python3 中没有区别,但在 python2 中,不扩展object
为您提供了旧式类;您想在旧式课程上使用新式课程。