python入门到秃顶(10):new方法、定制属性访问、描述符与装饰器
一,__new__方法
-
四个点理解
1,__new__方法是在类创建实例的时候自动调用 2,实例是通过继承的基类里面的__new__方法创建出来的 3,先调用__new__方法创建实例,再调用__init__方法初始化实例 4,__new__方法,后面的cls代表的是类本身 5,print(objict.__new__(cls) = print(aaa)创建实例
-
单例模式
1,先创建一个私有属性,定义为None 2,进行第一次条件判断, 3,用基类的new方法创建一个实例赋值给类的私有属性,返回给new 4,以后无论在这这个类里面创建几个实例都是第一个实例!
二,定制属性访问
-
增
1,# setattr 接收实例,属性,属性值三个参数,若不存在这个属性,增加这个属性,若存在修改属性
-
删
1,# delattr 接收实例,属性两个参数,删除这个实例的属性
2,# 实例__delattr__(属性) 底 层自动调用delattr,删除属性
-
改
1,# setattr 接收实例,属性,属性值三个参数,修改原来属性值为现属性值
2,# 实例.__setattr__(属性, 值)使用这个魔法方法时底层自动调用setattr这个方法
-
查
1,# hasattr 接收实例,属性两个参数,返回bool值
2,# getattr 接收实例,属性两个参数,返回实例的属性的值,找不到报错
- 查看(访问)不存在的属性名时自动调用的魔法方法
1,def __getattr__(self,item): print('没有这个属性') # 若用户访问的属性不存在时候自动调用__getattr__这个魔法方法,item是你访问的不存在的属性名 * 若没有定义这个方法,在访问不存在的属性的时候就会报错!
3,# 实例.__getattribute__(属性) 使用这个魔法方法会自动调用getattr,找不到报错
-
查看(访问)存在的属性名时自动调用的魔法方法
1,def __getattribute__(self,item): print('你正在访问{}属性'.format(item)) return object.__getattribute__(self,item) # 这个魔法方法会在用户访问不管存在或不存在的属性时都会自动调用,但访问不存在会报错 # 由于我们不知道我们要这样返回用户访问的值,直接调用父类里面的__getattribute__魔法方法,父类会帮我们返回
- 查看(访问)不存在的属性名时自动调用的魔法方法
三,描述符
# 如果一个对象实现了__get__,__set__,__delete__这三个魔法方法中的任意一个,那么该对象为描述符,或这个类创建的实例是描述符
class A(object):
def __get__(self, instance, owner):
print('get')
def __set__(self, instance, value):
print('set')
def __delete__(self, instance):
print('del')
class B(object):
m = A()
def __del__(self):
print('主人,执行完了!')
s = B()
s.m # 访问s的属性m 调用get方法
s.m = 6 # 设置s的属性m的值,调用set方法
del s.m # 删除s的m属性时,调用delete方法
=================== RESTART: C:\Users\满怀心\Desktop\test1.py ===================
get
set
del
主人,执行完了!
四,装饰器
-
装饰器:在不修改原函数代码的情况下给一个函数增加新功能
@装饰器
def 被装饰的函数():
pass
-
python自带的三个内置类装饰器
-
类装饰器
练习:
# time模块
>>> import time
>>> time.time()
1547363100.7947018 # 时间戳,
# 1970,1,1 00点到当前这个时间的时间差,单位秒
time.sleep(时间) :让时间休眠几秒钟