老式类old style class
class OldStyleClass():
def __init__(self, a):
self.a = a
新式类new style class
class NewStyleClass(object):
def __init__(self, a):
self.a = a
class OtherNewStyleClass(NewStyleClass):
def __init__(self, a):
super(OtherNewStyleClass, self).__init__(a)
新式类继承自object或者其他新式类。新式类可以使用super函数,而且比老式类多了一些特殊方法,比如__new__方法。
__new__方法是一个静态方法,你不需要通过staticmethod来特意指定,python解释器会自动判断。当你执行C(*args, **kwargs)时,
python的内部操作是先执行C.__new__(C,*args,**kwargs),比如new方法返回的结果叫ret,python会判断ret是否是C的实例,如果
是C的实例就执行C.__init__(ret,*args,**kwargs),通过init方法来初始化实例。
#c = C(10) 等价于
c = C.__new__(C,10)
if isinstance(c, C): C.__init__(c, 10)
单例模式
class singleton(object):
__instance = None
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls, *args, **kwargs)
return cls.__instance
class C(singleton):
pass
if __name__ == "__main__":
c = C()
c.a = 'a'
print c.a
c = C()
#如果不继承singleton,将抛出异常:AttributeError: 'C' object has no attribute 'a'
print c.a