#上下文协议:文件操作时使用with执行
# with open('a.txt','w',encoding='utf-8') as f1:
# with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法
# class Open:
# def __init__(self,name):
# self.name = name
# def __enter__(self):
# print('如果出现with语句,__enter__就被触发')
# def __exit__(self, exc_type, exc_val, exc_tb):
# print('with语句一旦执行完毕,__exit__就会被触发')
# with Open('a.txt') as f1:
# print('各种执行代码块')
# 如果出现with语句,__enter__就被触发
# 各种执行代码块
# with语句一旦执行完毕,__exit__就会被触发
########################################################################################################
# __exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行
# class Open:
# def __init__(self,name):
# self.name = name
# def __enter__(self):
# print('如果出现with语句,__enter__就被触发')
# def __exit__(self, exc_type, exc_val, exc_tb):
# print('with语句一旦执行完毕,__exit__就会被触发')
# with Open('a.txt') as f1:
# print('各种执行代码块')
# raise AttributeError ('抛出一个超级异常')
# print('我就不会被执行了')
# 如果出现with语句,__enter__就被触发
# 各种执行代码块
# with语句一旦执行完毕,__exit__就会被触发
# Traceback (most recent call last):
# File "F:/Python/PythonLeaning/每日学习打卡/Day28.py", line 27, in <module>
# raise AttributeError ('抛出一个超级异常')
# AttributeError: 抛出一个超级异常
########################################################################################################
# class Open:
# def __init__(self,name):
# self.name = name
# def __enter__(self):
# print('如果出现with语句,__enter__就被触发')
# def __exit__(self, exc_type, exc_val, exc_tb):
# print('with语句一旦执行完毕,__exit__就会被触发')
# return True #执行时即使报错也当错误不存在
# with Open('a.txt') as f1:
# print('各种执行代码块')
# raise AttributeError ('抛出一个超级异常')
# print('我就会继续被执行了,因为__exit__被加了return True')
########################################################################################################
# 用途或者说好处:
# 1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
# 2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,
# 你无须再去关系这个问题,这将大有用处
########################################################################################################
# NameError:异常类-->class
# name 'asda' is not defined-->异常值
# Traceback -->追溯信息
########################################################################################################
#描述符
# 一、描述符本身应该定义成新式类(继承了object类),被代理的类也应该是新式类
# 二、必须把描述符定义成这类的类属性,不能低昂一道构造函数中
# 三、要严格遵循优先级
# python是弱类型语言:不用定义变量的类型就可以使用
# def test(x):
# print('---->',x)
# test('a')
# test(1)
# 为python加上类型检测:
# class Typed:
# def __init__(self,key,excepted_type):
# self.key= key
# self.excepted = excepted_type
# def __get__(self, instance, owner):
# print('get方法')
# # print('instance 参数【%s】'%instance)
# # print('owner 参数【%s】'%owner)
# return instance.__dict__[self.key]
# def __set__(self, instance, value):
# print('set方法')
# # print('instance 参数【%s】'%instance)
# # print('value 参数【%s】'%value)
# # print('---->',instance)
# if not isinstance(value,self.excepted):
# print('你传入的类型不是字符串,错误')
# return
# else:
# instance.__dict__[self.key] = value
# class People:
# name = Typed('name',str)
# age = Typed('age',int)
# # age = Typed('age')
# def __init__(self,name,age,salary):
# self.name = name #触发的是被代理,而不是实例化
# self.age = age
# self.salary = salary
# # p1 = People('panda',18,2100.1245)
# p2 = People(9527,18,29213)
# # print(p1.name)
# # p2 = People(1,10,20)
# # print(p1.__dict__)
# # print(p1.name)
# print(p2.name)
########################################################################################################
# 类的装饰器原理
# def deco(obj):
# print('----------->>>>',obj)
# obj.x = 1
# obj.y = 2
# obj.x = 3
# return obj
# # @deco #dtest = deco(test)
# # def test():
# # print('test函数运行')
# # test()
# @deco #Foo = deco(Foo)
# class Foo:
# pass
# f1 = Foo()
# print(Foo.__dict__)
########################################################################################################
# def Typed(*args,**kwargs):
# def deco(obj):
# print('---->>',kwargs)
# print('---->>', obj)
# for key ,val in kwargs.items():
# setattr(obj,key,val)
# return obj
# print('==>',kwargs)
# return deco
# @Typed(x = 1,y = 2,z = 3)
# class Foo:
# pass
# print(Foo.__dict__)
# @Typed(name = 'egg')
# class Bar:
# pass
# 用装饰器为类增加一个数据属性
########################################################################################################
# 再看property
# 一个静态属性property本质就是实现了get,set,delete三种方法
# class Lazyproperty:
# def __init__(self,func):
# self.func = func
# def __get__(self, instance, owner):
# print('我是get方法')
# if instance is None:
# return self
# res = self.func(instance)
# setattr(instance,self.func.__name__,res)
# return res
# class Room:
# def __init__(self,name,width,length):
# self.name = name
# self.width = width
# self.length = length
# @ Lazyproperty #area = property(area) 给Room添加了一个类对象
# def area(self):
# return self.width * self.length
# @property #test = property(test)
# def area1(self):
# return self.width * self.length
# @property
# def test(self):
# return ('返回一个值')
# r1 = Room('toilet',1,2)
# #实例调用
# # print(r1.area)
# # print(Room.__dict__)
# # 类调用
# #print(Room.area)
# print(r1.area)
# print(r1.__dict__)
# print(r1.area)
# print(r1.area)
# print(r1.area)
# print(r1.test)
#函数运行时要把实例本身传入,而不是类
#描述符用来代理类的属性
# 类调用的instance传入的是None,实例调用的instance传入的是self
########################################################################################################
# 延迟计算的功能:对于已经运行的函数,将结果存储在内存中,下一次调用方法的时候就不再运行函数而是直接调用
# (本质就是把一个函数属性利用装饰器原理做成一个描述符:类的属性字典中函数名为key,value为描述符类产生的对象)
# 描述符是很多高级库和框架的重要工具之一,描述符是通常使用到装饰器或者元类的大型框架中的一个组件
# class Foo:
# @property
# def AAA(self):
# print('get的时候运行我')
# return self
# @AAA.setter
# def AAA(self,value):
# print('set的时候运行我',value)
# @AAA.deleter
# def AAA(self,value):
# print('delete的时候运行我')
# f1 = Foo()
# f1.AAA = 'aaa'
########################################################################################################
# class Foo:
# def get_AAA(self):
# print('get的时候运行我')
# return self
# def set_AAA(self,value):
# print('set的时候运行我')
# def del_AAA(self):
# print('delete的时候运行我')
# AAA = property(get_AAA,set_AAA,del_AAA)
# # 只有属性在AAA定义property后才能定义AAA,setter,AAA,delete
# f1 = Foo()
# f1.AAA = 'aaa'
########################################################################################################
# metaclass--->元类
# class Foo:
# pass
# f1 = Foo() #f1是通过Foo实例化对象
# python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载class的时候就会创建一个对象
# (这里的对象指的是类而非类的实例)
# f1是Foo这个类产生的对象,而Foo本身也是对象
# print(type(f1))
# print(type(Foo))
#————————————————————————————————————————————————————#
# 什么是元类?
# 元类是类的类,是类的模板
# 元类是用来控制如何创建类的,正如类是创建对象的模板一样
# 元类的实例为类,正如类的实例对象(f1对象是Foo类的一个实例,Foo类是type类的一个实例)
# type是python的一个內建元类,用来控制生成类,python中任何class定义的类其实都是type实例化的对象
# type(类名,object,属性字典)
# class Foo:
# def __init__(self,name):
# self.name = name
# pass
# print(Foo)
# def __init__(self,name,age):
# self.name = name
# self.age = age
# FFo = type('FFo',(object,),{'x':1,'__init__':__init__})
# print(FFo)
# print(FFo.__dict__)
# f1 = FFo('alex',19)
# print(f1.name)
# class MyType(type):
# def __init__(self,a,b,c):
# print('元素的构造函数执行')
# # print(a)
# # print(b)
# # print(c)
# def __call__(self, *args, **kwargs):
# print('====>')
# print(self)
# print(*args,**kwargs)
# obj = object.__new__(self)
# self.__init__(obj,*args,**kwargs) #实际在执行Foo.__init__()
# class Foo(metaclass=MyType): #type('Foo',(object),{}) MyType传入了4个参数
# def __init__(self,name):
# self.name = name
# f1 = Foo('OneName')
# 练习一:在元类中控制把自定义类的数据属性都变成大写

Pyhton学习——Day28的更多相关文章

  1. Pyhton学习——Day26

    #多态:多态指的是一类事物有多种形态# import abc# class Animal(metaclass = abc.ABCMeta):# 同一类事物:动物# @abc.abstractclass ...

  2. pyhton 学习

    官方学习文档 https://docs.python.org/3/tutorial/

  3. 20190320_head first pyhton学习笔记之构建发布

    1.把代码nester.py放入文件夹nester中,在文件夹中再新建一个setup.py文件,文件内容如下: from distutils.core import setup setup( name ...

  4. Pyhton学习——Day2

    Python开发IDE(工具)Pycharm.eclipse1.循环while 条件 #循环体 #条件为真则执行 #条件为假则执行break用于退出所有循环continue用于退出当前循环 2.Pyc ...

  5. Pyhton学习——Day27

    # hasattr(obj,'name')-->obj.name# getattr(obj,'name',default = 'xxx')--->obj.name# setattr(obj ...

  6. Pyhton学习——Day25

    #面向对象的几个方法#1.静态方法@staticmethod,不能访问类属性,也不能访问实例属性,只是类的工具包#2.类方法:@classmethod,在函数属性前加上类方法,显示为(cls)代表类, ...

  7. Pyhton学习——Day24

    # #面向对象设计:# def dog(name,gender,type):# def jiao(dog):# print('One Dog[%s],wfwfwf'%dog['name'])# def ...

  8. Pyhton学习——Day23

    #re模块方法:findall search#findall:返回所有满足匹配条件的数值,放在列表里#search : #函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象 ...

  9. Pyhton学习——Day22

    #有缩进的代码表示局部作用域的代码#if_name_ =='_main_' # while True#先引入一个os模块import os,sys,time,json# print(os.path.d ...

随机推荐

  1. 【udacity】机器学习-波士顿房价预测

    import numpy as np import pandas as pd from Udacity.model_check.boston_house_price import visuals as ...

  2. 路飞学城Python-Day141

    什么是爬虫    爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 爬虫的目的就是为了模拟浏览器进行网络数据访问               抓取数据的两种方式          ...

  3. UVA227 - Puzzle(紫书习题3.5)

    #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring&g ...

  4. Oracle与Mysql内嵌游标的使用示例

    Oracle 游标用For循环比较简单,Mysql也是最近才开始用,感觉稍微麻烦一点,下边直接上代码: ------------------------------------------------ ...

  5. 菜鸟学习ios

    object-c中@interface和@property声明变量的区别   Objective-C语言关键词,与@synthesize配对使用.xcode4.5以及以后的版本,@synthesize ...

  6. Cookie 工具类

    一.导入 jar 包 <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet ...

  7. oracle schema彻底理解

    oracle中的Schema简析 在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中,同时,每一个schema对应一个用户,不同的应用可以以不同的用户连接数据库,这样 ...

  8. 4418: [Shoi2013]扇形面积并|二分答案|树状数组

    为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...

  9. 【前端福利】用grunt搭建自己主动化的web前端开发环境-完整教程

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发者.假设你如今还不知道grunt或者听说过. ...

  10. SQL 递归使用

    直接贴代码吧= = WITH CTE AS ( -->Begin 一个定位点成员 SELECT COUNTRYORDERID,HSNAME, COUNTRYNAME,PARENTORDERID, ...