一.昨日内容回顾

  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系列、异常处理的更多相关文章

  1. python全栈开发从入门到放弃之异常处理

    1.try except num = input('num : ') #try在阶段中处理异常 try: f = open('file', 'w') int(num) except ValueErro ...

  2. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  3. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  4. 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  可迭代的 可迭 ...

  5. python全栈开发中级班全程笔记(第二模块、第三章)(员工信息增删改查作业讲解)

    python全栈开发中级班全程笔记 第三章:员工信息增删改查作业代码 作业要求: 员工增删改查表用代码实现一个简单的员工信息增删改查表需求: 1.支持模糊查询,(1.find name ,age fo ...

  6. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  7. python全栈开发之匿名函数和递归函数

    python 匿名函数和递归函数 python全栈开发,匿名函数,递归函数 匿名函数 lambda函数也叫匿名函数,即函数没有具体的名称.是为了解决一些功能很简单需求而设计的一句话函数.如下: #这段 ...

  8. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  9. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

随机推荐

  1. 使用JS监听键盘按下事件(keydown event)

    1.监听全局键盘按下事件,例如监听全局回车事件 1 $(document).keydown(function(event){ 2 if(event.keyCode == 13){ 3 alert('你 ...

  2. Python发邮件的小脚本

    # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText mailto_list = ['hitwh_Gy ...

  3. Hibernate_day03

    一.今天内容 0 列表功能实现 1 表与表之间关系回顾 (1)一对多(客户和联系人) (2)多对多(用户和角色) 2 hibernate一对多操作 (1)一对多映射配置 (2)一对多级联保存 (3)一 ...

  4. Syncfusion HTMLUI研究一

    HTMLUI可以加载HTML页面,并且相比WebKit等占用资源特别少 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitiona ...

  5. python中修改工作目录

  6. include的作用

    #include发生在预处理阶段,整个编译链接过程,#include是最简单的了,没有之一.就是在include的位置直接把文件原原本本完完整整一字不落的包含进来,下面举一个极端点的例子: //fil ...

  7. js获取对象的最后一个

    Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-i ...

  8. CodeForces Contest #1137: Round #545 (Div. 1)

    比赛传送门:CF #1137. 比赛记录:点我. 每次都自闭的 div1 啊,什么时候才能上 IM 呢. [A]Skyscrapers 题意简述: 有一个 \(n\times m\) 的矩阵 \(a_ ...

  9. SpringMVC使用Hession发布远程服务

    (1)三个项目,Api(存放提供者和消费者共有的xx,例如实体类以及服务接口等等).Service(服务提供者).Provider(服务消费者) Api部分代码 package cn.coreqi.e ...

  10. python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multib

    python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multib ...