我正在学习python并向OOP介绍自己.但是,我正在努力理解如何最好地构建类,特别是,以下类定义之间的差异以及何时应该使用每个类:
class my_class:
content...
class my_class():
content...
class my_class(object):
content...
Run Code Online (Sandbox Code Playgroud)
我一直在阅读非常有用的python在线帮助,虽然没有找到这个问题的具体答案.所以任何想法或推荐的参考将不胜感激,谢谢.
好吧,我可以立即说第二种方法没有什么特别之处:
class my_class():
content...
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,括号是多余的,根本不影响类定义.@ chepner的评论解释了Python允许你拥有它们的原因.基本上,因为基类列表(放在括号内的代码)可能是任何有效的表达式,所以()
是允许的,因为它在语法上是有效的.
其他两种方法的目的取决于您使用的Python版本.
以下代码将创建旧式或经典类:
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中,所有类都隐式继承,object
因此是新式类.
这意味着它现在是多余的:
class my_class(object):
content...
Run Code Online (Sandbox Code Playgroud)
因为这样做:
class my_class:
content...
Run Code Online (Sandbox Code Playgroud)
将产生相同的结果.但是,许多程序员仍然明确地继承object
,使他们的类向后兼容旧版本的Python.