Python 类classname:和类classname():与类classname(对象)之间的差异:
我正在学习python,并向大家介绍OOP。然而,我很难理解如何最好地构建类,尤其是以下类定义之间的区别以及何时应该使用它们: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+中的行为: 类定义
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,所以现在将习惯于始终从对象继承,因为这似乎是一种更好的方法。