day20-双下new方法,单例模式
# 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方法,单例模式的更多相关文章
- day19-3个双下item方法
#使用双下item方法来实现属性的增删改查: # 查:__getitem__ 增改:__setitem__ 删除: __delitem__ class Goods: def __init__(self ...
- Python - 面向对象编程 - 魔术方法(双下划线方法)
什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...
- python面向对象双下划线方法与元类
目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...
- python_面向对象——双下划线方法
1.__str__和__repe__ class Person(object): def __init__(self,name,age): self.name = name self.age = ag ...
- python类中的双下划线方法
__getitem__,__setitem__和__delitem__ 实现了对象属性的字典化操作. class Person: def __init__(self, name, age, hobby ...
- Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法
类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...
- Python面向对象 | 双下方法
定义:双下方法是特殊方法,他是解释器提供的.由双下划线+方法名+双下划线 .它具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更 ...
- Python 入门 之 双下方法
Python 入门 之 双下方法 1.双下方法 定义:双下方法是特殊方法,它是解释器提供的 由双下划线加方法名加双下划线 方法名的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我 ...
- day27:反射和双下方法
1, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...
随机推荐
- POJ 1149:PIGS 网络流经典题
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18345 Accepted: 8354 Description ...
- XML--XML Schema Definition(三)
参考 http://www.w3school.com.cn/schema/index.asp XSD 复合元素 复合元素指包含其他元素及/或属性的 XML 元素. 有四种类型的复合元素: 空元素 包含 ...
- Arduino学习——u8glib提供的字体样式
Fonts, Capital A Height4 Pixel Height U8glib Font FontStruct5 Pixel Height 04 Font 04 Font 04 Font ...
- clion 的 安装 变量配置的 搬运工(有点基础应该能看 大家看不懂 就是我自己看 哈哈哈哈哈哈)
1 自行安装一个 clion 2 https://blog.csdn.net/u013023297/article/details/80723847 mingw 的配置 第二篇好像当时 ...
- 如何在MySQL目录下找到my.ini
1. 打开ProgramData目录 2. 进入目录C:\ProgramData\MySQL\MySQL Server 8.0
- 79.常用的返回QuerySet对象的方法使用详解: filter, exclude,annotate
返回新的QuerySet的常用方法: 1.filter: 将满足条件的数据提取出来,返回一个新的QuerySet 以下所使用的模型article,category,定义模型models.py文件中,示 ...
- C# 串口编程,扫码枪使用
一.串口通信简介 串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为 ...
- [极客大挑战 2019]Secret File
0x00知识点 没有过滤file 使用php的file伪协议去读取文件 ?file=php://filter/convert.base64-encode/resource=flag.php 0x01解 ...
- iPhone到底能不能充一整夜电?
其实在国内,手机充电一直是个"玄学问题".早在多年前就有大神向小白敦敦教导,"新买的手机要将电用完,并充12个小时,如此反复三次才能延长手机电池寿命".甚至直到 ...
- goahead(web服务器)分析
一.参考网址 1.源码的github地址 二.网页是采用文件读写方式,还是转换为数组方式? 1)其通过宏定义“WEBS_PAGE_ROM”来区分,我是在websPageReadData()(page. ...