精华内容
下载资源
问答
  • python-重写new方法

    2020-01-05 19:39:23
    class MusicPlayer: def __init__(self): print("播放器初始化") ... def __new__(cls, *args, **kwargs): print("创建对象,分配空间") instance= super().__new__(cls) return instance ...
    class MusicPlayer:
        def __init__(self):
            print("播放器初始化")
    
        def __new__(cls, *args, **kwargs):
            print("创建对象,分配空间")
            instance= super().__new__(cls)
            return instance
    
    
    player = MusicPlayer()
    print(player)
    展开全文
  • 重写__new__方法的代码非常固定! 重写__new__方法一定要return super().__new__(cls)

    重写__new__方法的代码非常固定!

    • 重写__new__方法一定要return super().__new__(cls)
    展开全文
  • 作者:小白jiang 第一点:单例模式是什么? 答:单例模式,就是确保一个类中只有一个实例...第二点:重写new方法实现单例模式? 这里,就举个地球的例子,因为只有一个地球,不管实例化几次,都应该是相同的一个,所...

    作者:小白jiang

    第一点:单例模式是什么?

    答:单例模式,就是确保一个类中只有一个实例存在。像python的模块就是天然的单例模式,因为模块在第一次导入的时候,会生成.pyc文件,当第二次导入的时候,就会直接加载.pyc文件,而不会再执行模块代码。
    单例模式也是一种设计模式

    第二点:重写new方法实现单例模式?

    这里,就举个地球的例子,因为只有一个地球,不管实例化几次,都应该是相同的一个,所以写地球这个类的时候,需要用单例模式的设计思想。

    class Earth(object):
    
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, 'instance'):
                cls.instance = super().__new__(cls)
            return cls.instance
    
        def __init__(self):
            self. name = '地球'
            
    # 第一次实例化
    a = Earth()
    print(id(a))
    
    # 第二次实例化
    b = Earth()
    print(id(b))
    

    结果

    30943944
    30943944
    

    发现两次实例的对象的id一样,说明只存在一个实例。

    个人网站:www.nihao070.cn

    展开全文
  • ** 1,单例设计模式 ** class MySingleton: __obj = None ... def __new__(cls, *args, **kwargs): # cls当前的类对象 if cls.__obj is None: # 判断当前类对象下面的类属性是否为空 cls...

    **

    1,单例设计模式 (推荐重写new()方法)

    **

    class MySingleton:
        __obj = None
        __init_flag = True
    
        def __new__(cls, *args, **kwargs):  		# cls当前的类对象
            if cls.__obj is None:  					# 判断当前类对象下面的类属性是否为空
                cls.__obj = super().__new__(cls)  	# 如果为空 就调用父类的new方法 分配空间(或者说是创建一个对象)
    
            return cls.__obj
    
        def __init__(self, name):
            if MySingleton.__init_flag:
                print("init....")
                self.name = name
                print(self.name)
                MySingleton.__init_flag = False
    
    
    a = MySingleton("aa")
    print(a)
    b = MySingleton("bb")
    print(b)
    

    运行结果为:

    init....
    aa
    <__main__.MySingleton object at 0x000001AC1DC4D668>
    <__main__.MySingleton object at 0x000001AC1DC4D668>
    

    从运行结果可以看出:初始化方法只被执行了一次。而且两个对象返回的内存地址是相同的。

    **

    2,工厂模式

    **
    工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择实现类,创建对象进行统一的管理和控制

    class CarFactory:
        def create_car(self, brand):
            if brand == "奔驰":
                return Benz()
            elif brand == "宝马":
                return BMW()
            elif brand == '比亚迪':
                return BYD()
            else:
                return "未知品牉,无法创建"
    
    
    class Benz:
        pass
    
    
    class BMW:
        pass
    
    
    class BYD:
        pass
    
    
    factory = CarFactory()
    c1 = factory.create_car("奔驰")
    c2 = factory.create_car("宝马")
    print(c1)
    print(c2) 
    

    运行结果如下:

    <__main__.Benz object at 0x0000023468A5C748>
    <__main__.BMW object at 0x0000023468A5C780>
    

    **

    3,上面的工厂类可以改版成单例设计模式

    **

    class CarFactory:
        __obj = None
        __init_flag = True
    
        def create_car(self, brand):
            if brand == "奔驰":
                return Benz()
            elif brand == "宝马":
                return BMW()
            elif brand == '比亚迪':
                return BYD()
            else:
                return "未知品牌,无法创建"
    
        def __new__(cls, *args, **kwargs):
            if cls.__obj is None:
                cls.__obj = super().__new__(cls)
            return cls.__obj
    
        def __init__(self):
            if CarFactory.__init_flag:
                print("init CarFactory")
                CarFactory.__init_flag = False
    
    
    class Benz:
        pass
    
    
    class BMW:
        pass
    
    
    class BYD:
        pass
    
    
    factory = CarFactory()
    c1 = factory.create_car("奔驰")
    c2 = factory.create_car("宝马")
    print(c1)
    print(c2)
    
    factory1 = CarFactory()
    factory2 = CarFactory()
    print(factory)
    print(factory1)
    print(factory2)
    

    运行结果如下:

    init CarFactory
    <__main__.Benz object at 0x000001B3680CC898>
    <__main__.BMW object at 0x000001B3680CC860>
    <__main__.CarFactory object at 0x000001B3680CC828>
    <__main__.CarFactory object at 0x000001B3680CC828>
    <__main__.CarFactory object at 0x000001B3680CC828>
    

    上面可以看到工厂的实例对象全部返回的是同一个地址

    **

    以上

    **

    如有错误 欢迎指正
    欢迎 复制 粘贴 评论 转发 点赞

    **

    轻轻一点 好运连连

    **

    展开全文
  • 一、python中的单例 (多个对象一个地址) class MusicPlayer(object): #object:基类 #记录第一次被创建的引用 instance = None def __new__(cls, *args, **kwargs): #1.判断类属性是否为空对象 if cls....
  • 单例模式 Ensure a class has only one instance, and provide a global point of access to it. 确保一个类只有一个实例,并且提供一个访问它的全局方法。...重写 new 和 init 方法 # -*- coding:utf-8 -*- clas...
  • 使用类名()创建对象的时候,python解释器首先会调用__new__方法为对象分配空间 __new__是一个由object基类提供的内置的静态方法,主要作用有两个: 1.在内存中为对象分配空间 2.返回对象的引用 python解释器...
  • Pythonnew方法的应用

    2016-05-09 08:54:17
    Python中__new__方法是在一个类对象实例化的时候调用的第一个方法,它的第一个个参数是这个类对象(cls),而其他的参数会直接传递给__init__方法,它通常会返回这个类对象的一实例对象,当然你也可以重写__new__方法使其...
  • 个人最初常用的是重写__new__方法的方式,但是用重写类中的__new__方法,在多次创建对象时,尽管返回的都是同一个对象,但是每次执行创建对象语句时,内部的__init__方法都会被自动调用,而在某些应用场景,可能存在...
  • python基类Object,作为最终的选择,如当前类未重写__new__方法,则会执行直接父类的__new__方法(继承关系复杂会出现多继承问题)。 实例对象是什么类型,是由__new__方法决定的,这也就是为啥单例指向的内存ID唯一的...
  • 什么是单例设计模式 new方法重写 可以看出,上述创建的对象内存地址一样,也就是说它们是同一个对象。 举例:手机听歌时一次只能播放一首歌
  • 在看到老师重写__new__方法时,并未用@staticmethod声明这是一个静态方法: ![图片说明](https://img-ask.csdn.net/upload/201906/12/1560343896_389829.png) 那解释器如何判断出这是一个静态方法,而不是实例...
  • __new__()必须要有返回值,一般都是返回父类new方法出来的实例,即return super()__new__(cls)。 __new__()的返回值必须为当前类的实例时,__init__方法才会被调用。 如果(新式)类中没有重写__new__()方法,...
  • ''' __new__方法是一个由...2.返回对象的引用 重写__new__方法 一定要 return super().__new__(cls) 3.__new__是一个静态方法,在调用时需要主动传递cls参数 ''' class Cat(object): def __new__(cls, *args,...
  • 参考博文:https://blog.csdn.net/sinat_38682860/article/details/103979764 ------------------------------普通方式启动试试----------------------------- 第一种方法重写__new__方法【默认单例模式:导入模块...
  • 方法: ...• 重写 __ new __ 方法一定要 return super().__ new __(cls) 否则 python解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法 注意: __ new __ 是一个静态方法,在调用时需
  • object类中定义了一些所有类共有的默认实现,如:new()。 2,super()方法 super()是一个特殊函数,让你能够调用父类的方法 使用格式 子类中 def 父类的同名方法(self,形参列表): super().父类的
  • __new__()方法只能用于从object继承...重写__new__如果(新式)类中没有重写new方法python会默认调用该类的直接父类的new方法来构造该类的实例,如果该类的父类也没有重写new方法,那么将一直按照此规则一直追溯到obj
  • Python的__new__方法和__init__方法定义的理解区别一些说明重写__new__的作用 定义的理解 ** new(cls,[,…])** 方法在实例创建之前被调用,主要负责创建实例并返回该实例,它的第一个参数就是所需要创建的实例所属的...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 275
精华内容 110
关键字:

python重写new方法

python 订阅