首先,在讲解之前,我们需要了解的是python当中的实例方法、静态方法以及类方法。

  1. 实例方法
class Foo(object):
    def __init__(self):
        self.name = "hello world"
    def say(self):
        print("this is say() method")
foo=Foo()
foo.say()

通常情况下,类中定义的方法都是实例方法。它最少包含一个self参数,用于绑定此方法的实例对象。类对象可以直接调用实例方法。

  1. 静态方法
class Foo(object):
    @staticmethod
    def say():
        print("this is say() method")
#使用类名直接调用
Foo.say()
#使用类对象调用
foo=Foo()
foo.say()

静态方法其实就是函数,关键词为@staticmethod.

它和函数的区别在于,静态方法定义在类这个空间(类命名空间),静态方法没有类似 self、cls 这样的特殊参数,也正因为如此,类的静态方法中无法调用任何类属性和类方法。可以使用类名调用或者类对象调用。

  1. 类方法
class Foo(object):
    @classmethod
    def say(cls):
        print("this is say() method")
#使用类名直接调用
Foo.say()
#使用类对象调用
foo=Foo()
foo.say()

Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。关键词为@classmethod。也可以使用类名调用或者类对象调用,但是不推荐使用类对象调用。

一、__new__方法与__init__方法

构造方法包含创建对象和初始化对象,python当中分为两步执行,先执行__new__方法,再执行__init__方法。

  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

__new__方法至少要有一个参数cls,代表要实例化的类,必须返回实例化的实例,可以通过修改__new__方法来完成单例模式。

二、修改__new__方法来完成单例模式

class A:
 instance = None
 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance