#  1. __new__:构造方法,它创造对象,程序员口头语:new一个对象。先执行__new__方法再执行___init__方法。
class Goods:
def __init__(self):#如果self后面带有参数,那么下面的cls后面需要加上*args,**kwargs
print('init')
def __new__(cls):#因为双下new方法创建对象,执行new之前还没有对象,所以这里写cls,不能写self。
print('new')
return object.__new__(cls)#借助object类的双下new方法来创建对象,然后返回给上面双下init方法的self。
#这样双下init方法就可以执行了。
g = Goods()
print(g.__dict__) # new,先执行双下new方法来创建对象,再执行双下init方法。
# init
# {} # 2. 单例模式:一个类只有一个实例化对象。__discount在第一次实例化的时候,等于创建的对象,以后每一次实例化,
都把这个对象返回给self,所以只有一个实例化对象。 class Goods:
__discount = False
def __init__(self,name): #self接收对象,实例化的时候,self被双下init方法初始化,然后增加name属性。
self.name = name
def __new__(cls,*args,**kwargs):
if cls.__discount: #为真,说明非空,即有对象。
return cls.__discount #返回给self
else: #为假,没对象。
cls.__discount = object.__new__(cls) #增加对象
return cls.__discount #返回给self
apple = Goods('apple')
print(apple.name) #apple
pear = Goods('pear')
print(pear.name) #pear,apple和pear这两个变量都是指向同一个实例化对象。
print(apple.name) #pear,apple被pear覆盖了
print(id(apple)) #
print(id(pear)) #17656880,id一样,说明是同一个对象。
apple.color = 'yellow'#apple增加属性
print(pear.color) #yellow
print(apple.color) #yellow
print(pear._Goods__discount) #<__main__.Goods object at 0x00F86AB0>

day20-双下new方法,单例模式的更多相关文章

  1. day19-3个双下item方法

    #使用双下item方法来实现属性的增删改查: # 查:__getitem__ 增改:__setitem__ 删除: __delitem__ class Goods: def __init__(self ...

  2. Python - 面向对象编程 - 魔术方法(双下划线方法)

    什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...

  3. python面向对象双下划线方法与元类

    目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...

  4. python_面向对象——双下划线方法

    1.__str__和__repe__ class Person(object): def __init__(self,name,age): self.name = name self.age = ag ...

  5. python类中的双下划线方法

    __getitem__,__setitem__和__delitem__ 实现了对象属性的字典化操作. class Person: def __init__(self, name, age, hobby ...

  6. Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法

    类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...

  7. Python面向对象 | 双下方法

    定义:双下方法是特殊方法,他是解释器提供的.由双下划线+方法名+双下划线 .它具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更 ...

  8. Python 入门 之 双下方法

    Python 入门 之 双下方法 1.双下方法 ​ 定义:双下方法是特殊方法,它是解释器提供的 由双下划线加方法名加双下划线 方法名的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我 ...

  9. day27:反射和双下方法

    1, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...

随机推荐

  1. Bootstrap-模态框 modal.js

    参考网址:http://v3.bootcss.com/(能抄不写) 1.大模态框 图片效果图: 代码:(button的属性data-target对应的是具体模态框的class) <!-- Lar ...

  2. Ubuntu使用小技巧汇总

    1. Ubuntu创建/切换root用户 sudo passwd rootsu root 2. 解决Ubuntu14.04系统没有自带右键打开终端的问题 sudo apt-get install na ...

  3. 81.常用的返回QuerySet对象的方法使用详解:values和values_list

    values: 指定提取的数据库表中的字段值,如果不指定任何的字段名的话,默认情况下会提取所有的字段值.但是需要注意的是使用values返回的QuerySet对象中包括的是一个个的字典. 1.提取与A ...

  4. idea 使用技巧 - [copy reference]

    选择项目中某个函数名, 右键可以看到 copy reference, 点击完成复制symbol, 分享给别人. shift + shift 打开打开一个对话框, 把分享的symbol粘贴上去, 可以跳 ...

  5. 吴裕雄--天生自然 JAVASCRIPT开发学习: 验证 API

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...

  6. Codeforces Round #619 (Div. 2)E思维+二维RMQ

    题:https://codeforces.com/contest/1301/problem/E 题意:给个n*m的图形,q个询问,每次询问问询问区间最大的合法logo的面积是多少 分析:由于logo是 ...

  7. ftp限制

    /etc/hosts.deny /etc/vsftpd/user_list 从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现 ...

  8. 北邮14&18年软院机试【参考】答案

    2014 Problem A. 奇偶求和 题目描述: 给定N个数,分别求出这N个数中奇数的和以及偶数的和. 输入格式 第一行为测试数据的组数T(1<=T<=50).请注意,任意两组测试数据 ...

  9. render_template()的各种用法

    1.可以有很多个参数,第一个一定是模板的名字 2.可以传字典.列表.单个变量等等,还可以传函数,在模板中调用函数 后端函数: from flask import Flask from flask im ...

  10. spring-boot 如何加载rsources下面的自定义配置文件

    spring-boot 如何加载resources下面的自定义配置文件 https://segmentfault.com/q/1010000006828771?_ea=1144561