Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类classname:和类classname():与类classname(对象)之间的差异:_Python_Class_Oop - Fatal编程技术网

Python 类classname:和类classname():与类classname(对象)之间的差异:

Python 类classname:和类classname():与类classname(对象)之间的差异:,python,class,oop,Python,Class,Oop,我正在学习python,并向大家介绍OOP。然而,我很难理解如何最好地构建类,尤其是以下类定义之间的区别以及何时应该使用它们: class my_class: content... class my_class(): content... class my_class(object): content... 我一直在阅读非常有用的python在线帮助,尽管没有找到这个问题的具体答案。因此,如果您有任何想法或推荐的参考资料,我们将不胜感激。Python 2.2+中的行为: 类定义

我正在学习python,并向大家介绍OOP。然而,我很难理解如何最好地构建类,尤其是以下类定义之间的区别以及何时应该使用它们:

class my_class:
  content...

class my_class():
  content...

class my_class(object):
  content...
我一直在阅读非常有用的python在线帮助,尽管没有找到这个问题的具体答案。因此,如果您有任何想法或推荐的参考资料,我们将不胜感激。

Python 2.2+中的行为: 类定义
A
B
的行为方式相同,但是,
C
继承自对象:

class A:
    pass

class B():
    pass

class C(object):
    pass


>>> A.__dict__
{'__module__': '__main__', '__doc__': None}

>>> B.__dict__
{'__module__': '__main__', '__doc__': None}

>>> C.__dict__
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
这两个定义在行为上还有很多不同之处。请参阅GuidovanRossum关于这个问题的帖子,以及下面的python文档

工具书类 新样式和经典样式类:


好吧,我可以马上说,第二种方法没有什么特别之处:

class my_class():
  content...
在上面的代码中,括号是多余的,根本不影响类定义。@chepner的评论解释了Python允许您使用它们的原因。基本上,因为基类列表(放在括号内的代码)可以是任何有效的表达式,
()
是允许的,因为它在语法上是有效的


其他两种方法的用途取决于您使用的Python版本

Python2.x 以下代码将创建旧样式或经典类:

class my_class:
  content...
在2.2之前的Python版本中,旧式类是唯一可用的类类型。根据Python对它们的描述:

(旧式)阶级的概念与这个概念无关 类型:如果
x
是一个旧式类的实例,那么
x.\uuuuu class\uuuuu
指定
x
的类别,但
类型(x)
始终是
。 这反映了一个事实,即所有旧式实例都独立于 它们的类是用一个名为 例如

但是,在Python版本2.2或更高版本中,如果继承了内置的:

class my_class(object):
  content...
现在,您将创建一个新样式的类,它具有完全不同的对象模型。与前一个不同,新样式的类:

…既不多于也不少于用户定义的类型。如果
x
是一个实例 对于新样式的类,则
type(x)
通常与
x.\uuuuu类

如果您想了解更多关于旧样式和新样式类之间的区别的信息,请参阅这篇文章

Python3.x 在Python3.x中,所有类都隐式继承自
object
,因此都是新样式的类

这意味着,现在执行以下操作是多余的:

class my_class(object):
  content...
因为这样做:

class my_class:
  content...

将产生相同的结果。然而,许多程序员仍然显式地继承
对象
,以使他们的类向后兼容较旧版本的Python。

您使用的是哪个版本的Python?这将对您的问题的答案产生影响。以下是一些好的信息:根据,基类列表可以是一个完整的表达式(使用
如果……否则
,lambdas),而不仅仅是一个简单的名称元组。这样做的一个副作用是列表可以是空的。@chepner-谢谢你提供的信息。我将把它添加到我的答案中。新样式的类也有更好的性能,因此,如果你真的不在乎的话,我会养成从对象继承的习惯。@capturesteve-我同意。在Python2.x中,我也总是从
object
继承,因为新样式的类比旧样式的类优越。然而,在Python3.x中,这样做对我来说似乎是多余的,除非您计划在较旧的版本中使用您的类。谢谢,我使用的是2.7,所以现在将习惯于始终从对象继承,因为这似乎是一种更好的方法。