python全栈开发day24-__new__、__del__、item系列、异常处理
一.昨日内容回顾
1.反射
用字符串类型的名字,操作命名空间的变量。
反射使用场景:明显的简化代码,能拿到的变量名本来就是一个字符串类型的时候,
用户输入的,文件读入的,网上传输的
2.__call__
对象名() 就会调用__call__方法
3.__len__
4.__hash__
5.__eq__
6.__dict__
对象名.__dict__:查看对象空间的变量的变量,
类名.__dict__ 类空间
7.__slots__
#__slots__ = ('name','age')
8.__module__和__class__
9.isinstance和issubclass
二.今日内容总结
1.__new__
#创建一个对象,是一个构造方法,在初始化方法__init__(self,...)执行之前执行。
单例模式:
class A:
__instance = None
def __init__(self,name):
self.name = name def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance a = A('alex')
b = A('jack') print(a.name)
print(b.name)
单例模式举例
2.__del__
#在一个对象在内存中删除前,执行__del__方法
# 对比delattr 使用字符类型的变量从命名空间中删除这个变量
# 对比@property deleter 伪装成属性的方法,要执行删除属性
#Python解释器
#能够主动回收不用的变量
#在程序结束的时候所有的数据都会被清除
#如果用户主动删除某个变量
# 那么这个变量将会主动的被删除
#无论上述哪种方式
#在删除一个变量之前都会主动的执行析构方法__del__
应用:对象删除之前回归操作系统资源
class B:
def __init__(self,path):
self.f = open(path)
def __del__(self):
self.f.close()
b = B('userinfl')
3.__getitem__、__setitem__、__delitem__
# 有一些内置模块中的内置方法
#是依赖__getitem__方法的
#或者说是依赖item['a']这种调用方式的
# 洗牌,抽牌例子:
random.choice方法依赖(__len__,__getitem__)
random.shuffle方法依赖作用对象还有内置方(__len__,__getitem__,__setitem__)
import random
from collections import namedtuple
Card = namedtuple('card', ['rank', 'suit']) class FranchDeck:
ranks = [i for i in range(2, 11)] + list('JQKA')
suits = ['红心', '方块', '黑桃', '梅花'] def __init__(self):
self.__cards = [Card(rank, suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits] def __len__(self):
return len(self.__cards) def __getitem__(self, item):
return self.__cards[item] def __setitem__(self, key, value):
self.__cards[key] = value def __delitem__(self, key):
del self.__cards[key] deck = FranchDeck()
print(deck.__dict__)
print(deck[0])
random.shuffle(deck)
print(deck.__dict__)
print(random.choice(deck))
洗牌和抽牌的例子
4.异常处理
#try except
#try except else
#try except else finally
#try finally
# assert 1=2
# raise 主动抛出异常
# 自定义异常类型
class WuException(BaseException):
def __init__(self, name):
self.__name = name def __str__(self):
return self.__name try:
raise WuException('有东西错了试试吧')
except WuException as e:
print(e)
自定义异常类型例子
三.预习与扩展
1.对元类metaclass的理解:
1)、我们用class关键字创建的类,都是通过基类type类创建:
class Foo(object):
a = 1
def func():
print(6666)
等同于:type('Foo',(object,),{'a':1,‘func’:func})
def func():
print(6666)
2) 、 创建类的时候有优先找__metaclass__,自己没有找父类,父类没有找模块,一直找不到就会利用内置type进行类的创建
class A:
__metaclass__ = mm
3)、我们自己定制元类:
class metaclasstest(type):
def __new__(cls,name,bases,dict):
..........
return super().__new__(cls,name,bases,dict(可变化))
2.内置方法的小结:

class A:
name = 'jack' def __init__(self):
super().__init__() def __getattr__(self, item):
print('getattr没有该属性%s' % item) def __delattr__(self, item):
del self.__dict__[item] def __setattr__(self, key, value):
self.__dict__[key] = value # def __getattribute__(self, item):
# print('getattribute %s 不知道没有该属性' % item) # __getattr__ 调用没有属性时触发 a.age
# __setattr__ 添加属性时触发 a.age = 1
# __delattr__ 删除属性时触发 del a.age
# __getattribute__ 调用时有没有属性时都会触发 a.age # -----------------------------------------*---------------------------------------
# 当重写__getattribute__时,别的函数不在执行而是执行__getattribute__
a = A()
a.age
a.age = 1
print(a.__dict__)
有坑可以看看
python全栈开发day24-__new__、__del__、item系列、异常处理的更多相关文章
- python全栈开发从入门到放弃之异常处理
1.try except num = input('num : ') #try在阶段中处理异常 try: f = open('file', 'w') int(num) except ValueErro ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- python全栈开发从入门到放弃之迭代器生成器
1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable 可迭代的 可迭 ...
- python全栈开发中级班全程笔记(第二模块、第三章)(员工信息增删改查作业讲解)
python全栈开发中级班全程笔记 第三章:员工信息增删改查作业代码 作业要求: 员工增删改查表用代码实现一个简单的员工信息增删改查表需求: 1.支持模糊查询,(1.find name ,age fo ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- python全栈开发之匿名函数和递归函数
python 匿名函数和递归函数 python全栈开发,匿名函数,递归函数 匿名函数 lambda函数也叫匿名函数,即函数没有具体的名称.是为了解决一些功能很简单需求而设计的一句话函数.如下: #这段 ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
随机推荐
- 使用eclipse创建web项目的项目图文步骤
在eclipse中使用maven ① maven插件:eclipse内置 ②maven插件的设置: [1]installations:指定maven核心程序的位置,不建议使用自带的maven程序而应该 ...
- android BroadcastReceiver组件简单的使用
1.清单文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=& ...
- 主窗口QMainWindow和启动画面
在较为大型复杂,功能较多的应用程序中,我们通常继承QMainWindow类来进行开发.该主窗口为搭建应用用户界面提供了非常好的框架,请看下图: 可以看出该主窗口类为我们提供了菜单栏(Menu Bar) ...
- Flask最强攻略 - 跟DragonFire学Flask - 第八篇 实例化Flask的参数 及 对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- 论文笔记系列-Efficient Neural Architecture Search via Parameter Sharing
Summary 本文提出超越神经架构搜索(NAS)的高效神经架构搜索(ENAS),这是一种经济的自动化模型设计方法,通过强制所有子模型共享权重从而提升了NAS的效率,克服了NAS算力成本巨大且耗时的缺 ...
- 生成eps图形
(1) matlab可直接将生成图片保存为eps格式. print -fhandle -rresolution -dfileformat filename 例子:set(gcf,'paperposit ...
- MongoDB的基本概念
MongoDB的基本概念 库 db就是数据库 文档就是数据表的行 集合就是数据表,这个没有模式,啥叫没有模式呢,就是没有列的定义,随便什么属性都行,这点就比关系行数据库牛逼10000000倍,逆天了.
- 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 2【12-14】
这几关主要是考察POST形式的SQLi注入闭合 ## Less-12 - POST - Error Based- Double quotes- String ### 1)知识点 主要考察报错注入中的双 ...
- How to Repair GRUB2 When Ubuntu Won’t Boot
Ubuntu and many other Linux distributions use the GRUB2 boot loader. If GRUB2 breaks—for example, if ...
- kafka系列四、kafka架构原理、高可靠性存储分析及配置优化
一.概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...