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, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...
随机推荐
- CentOS7使用firewalld的基本命令
转自:https://www.cnblogs.com/moxiaoan/p/5683743.html.Thanks for 莫小安 1.firewalld的基本使用 启动: systemctl ...
- POJ 3278:Catch That Cow
Catch That Cow Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submi ...
- 18 12 23 html 基本学习
一个html的基本结构如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 自己组装一台1U服务器
视频资料链接 自己组装一台1U服务器 执行思路: 1.评估访问了,根据需求确定服务器要求 2.根据要求选择硬件:冗余.稳定等 3.搜索主流服务器参数进行对比,及对比价格 4.咨询IDC机房价格 DIY ...
- D语言-运算符
Part 0:概念 表达式:表达式是由非赋值运算符或特殊运算符和值组成的,每个表达式都可以计算出一个值 Part 1:非赋值运算符 §1.1 基本的运算符 基本的运算符有+,-,*,/,% 我相信你除 ...
- xhell ctrl+s 假死
如题. ctrl+q 即可接触 假死状态. 记录下
- 201771010123汪慧和《面向对象程序设计Java》第十周实验总结
一.理论部分 1.泛型:也称参数化类型.就是定义类.接口和方法时,通过类型参数指示将要处理的对象类型. 2.泛型程序设计:编写代码可以被很多不同类型的对象所重用. 3.泛型方法: a.除了泛型类外,还 ...
- java程序无法连接Rabbitmq
java程序不能连接到rabbitmq,提示有包括501.403.402等错误. 各种调试都没用,后来是尝试新建一个用户,在配置文件中使用新用户连接,最后才使程序成功运行.
- [ZJCTF 2019]NiZhuanSiWei
0x00知识点 1:data伪协议写入文件 2:php:// php://filter用于读取源码 php://input用于执行php代码 3反序列化 0x01解题 打开题目,给了我们源码 < ...
- php 随机useragent
<?php /** * 获取随机useragent */ private function get_rand_useragent($param) { $arr = array( 'Mozilla ...