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