new方法、制定属性访问、描述符与装饰器-创新互联

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