__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方法创建实例属性