new方法、制定属性访问、描述符与装饰器-创新互联
__new__
方法
1、四个点理解__new__
方法__new__
方法是在类创建实例的时候自动调用的- 实例时通过类里面的
__new__
方法被定义创建出来的 - 先调用
__new__
方法创建实例,再调用__init__
方法初始化实例 __new__
方法,后面括号里面的cls
指的时类本身
class Base:
def __init__(self):
print('这是在初始化方法里面')
def __new__(cls, *args, **kwargs): #cls代表的是类本身
print('这个cls是:',cls)
print('这是在new方法里面')
return object.__new__(cls) #必须有返回值
#实例的时候必须先调用__new__,再调用__init__
test = Base()
输出的结果:
这个cls是:这是在new方法里面
这是在初始化方法里面
单例模式
创新互联建站专注于金溪网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供金溪营销型网站建设,金溪网站制作、金溪网页设计、金溪网站官网定制、微信小程序开发服务,打造金溪网络公司原创品牌,更为您提供金溪网站排名全网营销落地服务。class Base(object):
__instance = None
def __new__(cls,*args,**kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
test = Base()
test2 = Base()
print(id(test1),id(test2))
1、定义一个私有属性__instance 等于None
2、然后我们判断它是否等于None,如果等于None,我们调用父类的方法创建一个实例对象,并把返回的对象赋值给__instance ,并且返回__instance
3、如果__instance 不等于None,那就说明已经创建了对象,我们直接把 __instance 返回除去。
单例模式的实现原理:通过重写__new__方法,让__new__只能进行一次实例创建。
在上面例子中,可以看到的是两个id是相同的,意味着第二次创建的时候没有真正意义上去创建,而是引用第一次创建了的实例,只是同一个实例的不同名字。
单例模式的用法用途:如果在多处想用这一个实例的时候,就可以用单例模式,创建多个相同的实例供使用。
二、定制属性访问 属性访问- hasattr :用来判断一个实例有没有一个属性
- getattr : 用来获取一个实例的某个属性值,如果这个属性不存在,则报错。
- setattr: 用来给一个实例添加某个属性或者修改某个属性的值,并赋值
- delattr:删除实例中的某个属性
class A:
def __init__(self):
self.name = 'Gollum'
self.age = 10
a = A()
print(hasattr(a,'name')) #判断有没有name属性
print(getattr(a,'name')) #获取name属性的值
print(setattr(a,'sex','woman')) #添加一个sex属性,赋值为woman
delattr(a,'name')
定制属性访问:
- 查
hasattr(re,'length') # 返回的是bool值
getattr(re,'length') #返回属性值
re.__getattribute__('length') #返回的是属性值
- 修改:
setattr(re,'length',6)
re.__setattr__('length',5)
- 增
re.aaa = 1
setattr(re,'bbb',2) #有bbb属性就改,没有的话就增加
re.__setattr__('ccc',4) #同上
- 删
delattr(re,'ccc')
re.__delattr__('bbb')
del re #删除对象
del re.name #删除属性
注意:魔法方法__getattr__
和__getattribute__
的区别,当我们在访问一个实例中不存在的一个属性的时候会调用__getattr__
这个魔法方法,如果这个属性存在,则会调用getattr
这个内置函数,并返回属性值,(__getattr__
是一个魔法方法,而getattr
是一个内置函数),当我们去访问一个属性的时候会调用__getattribute__
这个魔法方法
class A:
def __init__(self):
self.name = 'Gullom'
def __getattr__(self,item):
print('这个属性不存在')
def __getattribute__(self,item):
print('不好意思,我重新了,没办法返回属性值')
#如果想返回正常属性值,就要调用父类定义好的这个方法,和单例模式一样
return object.__getattrbute__(self,item)
a = A()
a.name1 #这个属性不存在,所以调用__getattr__这个魔法方法
print(a.name) #会调用__getattribute__这个魔法方法
3、描述符*描述符协议:*python描述符是一个"绑定行为"的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有__get__(),__set__(),和__delete__()
。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符。
class A:
def __get__(self,instance,owner):
print('get')
def __set__(self,instance,value):
print('set')
def __delete__(self,instance):
print('delete')
class B():
m = A()
b = B()
b.m #调用__get__
b.m.a = 0 #调用__set__
del b.m #调用__delete__方法
4、装饰器装饰器的本质是一个函数,能够实现不修改原来的函数的基础上添加的功能
def hello1(func):
print('hello1')
def hello2():
print('hello2')
func()
return hello2
@hello1 #装饰器,相当于hello1(hello)()
def hello():
print('hello')
python 中自带的三个内置装饰器
class Rectangle:
def __init__(self,length,width):
self.length,self.width = length,width
def area(self):
areas = self.length*self.width
return areas
@property #使得area这个方法的调用和属性一样不用加()
def area(self):
return self.width * self.length
@staticmethod #这个func方法里面不用写self
def func():
print('staticmethod func')
@classmethod #使得这个类作为装饰器
def show(cls):
print(cls)
print('show fun')
类装饰器的使用(类可以做装饰器,但是必须要定义__call__方法)
class Test_class:
def __init__(self,func):
self.func = func
def __call__(self):
print('类')
return self.func()
@Test_class
def fun_test():
print("This is a test functon")
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
标题名称:new方法、制定属性访问、描述符与装饰器-创新互联
文章链接:http://myzitong.com/article/dsopsj.html