一.昨日内容回顾

  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. 使用eclipse创建web项目的项目图文步骤

    在eclipse中使用maven ① maven插件:eclipse内置 ②maven插件的设置: [1]installations:指定maven核心程序的位置,不建议使用自带的maven程序而应该 ...

  2. android BroadcastReceiver组件简单的使用

    1.清单文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=& ...

  3. 主窗口QMainWindow和启动画面

    在较为大型复杂,功能较多的应用程序中,我们通常继承QMainWindow类来进行开发.该主窗口为搭建应用用户界面提供了非常好的框架,请看下图: 可以看出该主窗口类为我们提供了菜单栏(Menu Bar) ...

  4. Flask最强攻略 - 跟DragonFire学Flask - 第八篇 实例化Flask的参数 及 对app的配置

    Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...

  5. 论文笔记系列-Efficient Neural Architecture Search via Parameter Sharing

    Summary 本文提出超越神经架构搜索(NAS)的高效神经架构搜索(ENAS),这是一种经济的自动化模型设计方法,通过强制所有子模型共享权重从而提升了NAS的效率,克服了NAS算力成本巨大且耗时的缺 ...

  6. 生成eps图形

    (1) matlab可直接将生成图片保存为eps格式. print -fhandle -rresolution -dfileformat filename 例子:set(gcf,'paperposit ...

  7. MongoDB的基本概念

    MongoDB的基本概念 库 db就是数据库 文档就是数据表的行 集合就是数据表,这个没有模式,啥叫没有模式呢,就是没有列的定义,随便什么属性都行,这点就比关系行数据库牛逼10000000倍,逆天了.

  8. 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 2【12-14】

    这几关主要是考察POST形式的SQLi注入闭合 ## Less-12 - POST - Error Based- Double quotes- String ### 1)知识点 主要考察报错注入中的双 ...

  9. 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 ...

  10. kafka系列四、kafka架构原理、高可靠性存储分析及配置优化

    一.概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...