【Python之理解__new__和__init__的区别】

简介: 【Python之理解__new__和__init__的区别】

很多同学都以为Python中的__init__是构造方法,但其实不然,Python中真正的构造方法是__new__。__init__和__new__有什么区别?本文就来探讨一下。


我们先来看一下__init__的用法

class Person(object):
    def __init__(self, name, age):
        print("in __init__")
        self._name = name
        self._age = age 
p = Person("Wang", 33) 

上面的代码会输出如下的结果

in __init__
<__main__.Person object at 0x7fb2e0936450>

那么我们思考一个问题,Python中要实现Singleton怎么实现,要实现工厂模式怎么实现?

用__init__函数似乎没法做到呢~

实际上,__init__函数并不是真正意义上的构造函数,__init__方法做的事情是在对象创建好之后初始化变量。真正创建实例的是__new__方法。

我们来看下面的例子

class Person(object):
    def __new__(cls, *args, **kwargs):
        print("in __new__")
        instance = object.__new__(cls, *args, **kwargs)
        return instance
    def __init__(self, name, age):
        print("in __init__")
        self._name = name
        self._age = age
p = Person("Wang", 33)

上面的代码输出如下的结果

in __new__
in __init__

上面的代码中实例化了一个Person对象,可以看到__new__和__init__都被调用了。__new__方法用于创建对象并返回对象,当返回对象时会自动调用__init__方法进行初始化。__new__方法是静态方法,而__init__是实例方法。

好了,理解__new__和__init__的区别后,我们再来看一下前面提出的问题,用Python怎么实现Singleton,怎么实现工厂模式?

先来看Singleton

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance
s1 = Singleton()
s2 = Singleton()
print(s1)
print(s2) 

上面的代码输出

<__main__.Singleton object at 0x7fdef58b1190>
<__main__.Singleton object at 0x7fdef58b1190>

可以看到s1和s2都指向同一个对象,实现了单例模式。

再来看下工厂模式的实现

class Fruit(object):
    def __init__(self):
        pass
    def print_color(self):
        pass
class Apple(Fruit):
    def __init__(self):
        pass
    def print_color(self):
        print("apple is in red")
class Orange(Fruit):
    def __init__(self):
        pass
    def print_color(self):
        print("orange is in orange")
class FruitFactory(object):
    fruits = {"apple": Apple, "orange": Orange}
    def __new__(cls, name):
        if name in cls.fruits.keys():
            return cls.fruits[name]()
        else:
            return Fruit()
fruit1 = FruitFactory("apple")
fruit2 = FruitFactory("orange")
fruit1.print_color()    
fruit2.print_color()    

上面的代码输出

apple is in red
orange is in orange


相关文章
|
4天前
|
开发者 索引 Python
【Python 基础】remove、del和pop有什么区别?
【5月更文挑战第8天】【Python 基础】remove、del和pop有什么区别?
|
6天前
|
存储 Python
【Python 基础】“func”和“ func()”有什么区别?
【5月更文挑战第6天】【Python 基础】“func”和“ func()”有什么区别?
|
6天前
|
Python
【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
【5月更文挑战第6天】【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
|
6天前
|
Python
【Python 基础】“is”和“==”有什么区别?
【5月更文挑战第6天】【Python 基础】“is”和“==”有什么区别?
|
6天前
|
Python
【Python 基础】列表(list)和元组(tuple)有什么区别?
【5月更文挑战第6天】【Python 基础】列表(list)和元组(tuple)有什么区别?
|
C# Python
Python中的module,library,package之间的区别
背景 Python中有一些基本的名词,很多人,尤其是一些初学者,可能听着就很晕。 此处,简单总结一下,module,library,package之间的大概区别。 Python中的module的简介 module,中文翻译为:模块 Python中的module,说白了,就是Python文件,而python文件一般后缀为py,所以就是你的xxx.py而已。
1700 0
|
17天前
|
存储 人工智能 数据处理
Python:编程的艺术与科学的完美交融
Python:编程的艺术与科学的完美交融
19 1
|
4天前
|
JSON 数据格式 开发者
pip和requests在Python编程中各自扮演着不同的角色
`pip`是Python的包管理器,用于安装、升级和管理PyPI上的包;`requests`是一个HTTP库,简化了HTTP通信,支持各种HTTP请求类型及数据交互。两者在Python环境中分别负责包管理和网络请求。
19 5
|
6天前
|
存储 Python 容器
Python高级编程
Python集合包括可变的set和不可变的frozenset,用于存储无序、不重复的哈希元素。创建集合可使用{}或set(),如`my_set = {1, 2, 3, 4, 5}`。通过add()添加元素,remove()或discard()删除元素,如`my_set.remove(3)`。
10 0
|
7天前
|
测试技术 Python
Python模块化方式编程实践
Python模块化编程提升代码质量,包括:定义专注单一任务的模块;使用`import`导入模块;封装函数和类,明确命名便于重用;避免全局变量降低耦合;使用文档字符串增强可读性;为每个模块写单元测试确保正确性;重用模块作为库;定期维护更新以适应Python新版本。遵循这些实践,可提高代码可读性、重用性和可维护性。
32 2