类classname:AND class classname()之间的区别:AND class classname(object):

Ian*_*rts 4 python oop class

我正在学习python并向OOP介绍自己.但是,我正在努力理解如何最好地构建类,特别是,以下类定义之间的差异以及何时应该使用每个类:

class my_class:
  content...

class my_class():
  content...

class my_class(object):
  content...
Run Code Online (Sandbox Code Playgroud)

我一直在阅读非常有用的python在线帮助,虽然没有找到这个问题的具体答案.所以任何想法或推荐的参考将不胜感激,谢谢.

iCo*_*dez 5

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

class my_class():
  content...
Run Code Online (Sandbox Code Playgroud)

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


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

Python 2.x

以下代码将创建旧式或经典类:

class my_class:
  content...
Run Code Online (Sandbox Code Playgroud)

在2.2之前的Python版本中,旧式类是唯一可用的类.根据Python的文档:

(旧式)类的概念与类型的概念无关:如果x是旧式类的实例,则x.__class__ 指定类的类x,但type(x)始终是<type 'instance'>.这反映了这样一个事实,即所有旧式实例独立于其类,都使用一个称为实例的内置类型实现.

但是,在Python 2.2或更高版本中,如果从object内置继承,这一切都会发生变化:

class my_class(object):
  content...
Run Code Online (Sandbox Code Playgroud)

现在,您将创建一个新样式的类,它具有完全不同的对象模型.与其前身不同,是一种新式的类:

...既不是用户定义的类型,也不是用户定义的类型.如果x是新式类的实例,则type(x)通常与x.__class__... 相同

如果您想了解更多关于旧式和新式课程之间差异的信息,请参阅这个很棒的SO问题.

Python 3.x

在Python 3.x中,所有类都隐式继承,object因此是新式类.

这意味着它现在是多余的:

class my_class(object):
  content...
Run Code Online (Sandbox Code Playgroud)

因为这样做:

class my_class:
  content...
Run Code Online (Sandbox Code Playgroud)

将产生相同的结果.但是,许多程序员仍然明确地继承object,使他们的类向后兼容旧版本的Python.