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

时间:2014-03-27 14:12:40

标签: python class oop

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

class my_class:
  content...

class my_class():
  content...

class my_class(object):
  content...

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

2 个答案:

答案 0 :(得分:5)

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

class my_class():
  content...

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


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

Python 2.x

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

class my_class:
  content...

在2.2之前的Python版本中,旧式类是唯一可用的类。根据Python的documentation来说:

  

(旧式)类的概念与概念无关   类型:如果x是旧式类的实例,那么x.__class__   指定x的类,但type(x)始终为<type 'instance'>。   这反映了所有旧式实例的独立性   他们的类,用一个内置类型实现,称为   实例

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

class my_class(object):
  content...

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

  

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

如果您想了解更多有关旧式和新式课程之间差异的信息,请参阅这篇很棒的SO question,其中提到了这一点。

Python 3.x

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

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

class my_class(object):
  content...

因为这样做:

class my_class:
  content...

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

答案 1 :(得分:1)

Python 2.2 +中的行为:

类定义AB的行为方式相同,但C继承自object:

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__']

这两个定义的行为有很多不同之处。请参阅Guido van Rossum关于此事的帖子,以及下面的python文档。

参考

新风格和经典风格类:

http://python-history.blogspot.com/2010/06/new-style-classes.html

http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes