new方法、定制属性访问、描述符、装饰器

__new__方法

介绍

最先被执行的魔法方法,用于给实例对象指定内存空间

1、__new__方法是在类创建实例的时候自动调用的。
2、实例是通过类里面的__new__方法是在 类 创建出来的。
3、先调用__new__方法创建实例,再调用 __init__方法初始化实例。
4、__new__方法,后面括号里的cls代表的是类本身

单例模式

单例模式下,实例化出来的对象只有一个,都是相同的内存空间

class A:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, 'instance'):
            cls.instance = super().__new__(cls)
            
        return cls.instance

小结

new__方法会在初始化函数 __init__  之前执行
利用这个 __new__ 可以很方便的实现类的单例模式
__new__  方法合理利用可以带来方便,常应用在类的单例模式

定制属性访问

what

关于属性的增删改查

why

用于对属性的更改

How

re = Rectangle(3, 4)   # 矩形类实例

#查:
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', 3) # 同上

#删:
delattr(re , 'ccc')
re .__delattr__('bbb')
del re

小结

def __getattr__(self):
    属性不存在时,如果定义了此方法,则调用此方法
    
hasattr:判断是否存在属性,如果属性存在则进行下一步操作
getattr:得到属性值
setattr:设置属性

描述符

what

python描述符是一个“绑定行为”的对象属性

why

,起描述作用

How

 类A 是 类B 的类属性
class A:
    def __get__(self):
    def __set__(self):
    def __delete__(self):
        
class B:
    a = A()
    
b = B()


调用B类的类属性,就相当于进行了A类的实例化,这时
b.a			# 查,调用A类的get
b.a = 333	# 改,调用A类的set
def(b.a)	# 删,调用A类的delete


装饰器

what

本质是函数(闭包)

why

能够实现在不修改原来的函数的基础上添加功能

How

def A(func):
    def B():
        print(111)
        func()
        print(222)
	return B   


@A			# @A相当于a = A(S),在哪个函数上面写,就相当于把那个函数传进去
def S():
    print(123)

S()

内置装饰器

class Rectangle:
	def __init__(self, length, width):  
		self.length = length   
		self.width = width   
	def area(self):      
		areas = self.length * self.width   
		return areas
		
    @property  	# 就像访问属性一样  
    def area(self):      
        return self.width * self.length

    @staticmethod  	# 静态方法  和class类断开联系  
    def func():  	# self  在调用的时候会报错  
        print(staticmethod func’)

    @classmethod  	# 类方法  
    def show(cls):  	# 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('这是个测试函数')

小结

# 定义:
    装饰器本质就是一个闭包,在内层函数可以写很多通用功能,而且内层函数中调用了传入外	层函数的参数(这个参数往往是一个函数体)
# 使用:
	在想使用此功能的函数上方@外层函数的函数体即可

总结

# 实例及实例属性生成过程:
创建实例  >>>  调用new方法生成实例,分配内存空间  >>>  new方法返回类本身  >>>  调用init方法创建实例属性  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值