python
1、__new__方法:最先被执行的魔法方法
01__new__方法是在类创建实例的时候自动调用的。
02实例是通过类里面的__new__方法是在类创建出来的。
03先调用__new__方法创建实例,再调用__init__方法初始化实例。
04__new__方法,后面括号里的cls代替的是类本身。
class Base:
def __init__(self):
print('这里在初始化方法里面')
def __new__(cls, *args, **kwargs): #cls代表类本身
print('这个cls是:',cls) # cls 就是Base类
print('这是在new方法里面')
return object.__new__(cls) #必须有返回值
# 实例的时候会先调用__new__方法,然后再调用初始化方法
test = Base()
单例模式实例化出来的对象,都是相同的内存空间
class Base:
# def __init__(self):
# print('这里在初始化方法里面')
def __new__(cls, *args, **kwargs): #cls代表类本身
if not hasattr(cls, 'instance'):
cls.instance = super().__new__(cls)
return cls.instance
2、定制属性访问
01、查
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
print(areas)
return areas
a = Rectangle(6, 3)
print(a.length)
print(hasattr(a, 'length')) #返回bool值
print(getattr(a, 'length')) #返回属性值
print(a.__getattribute__('length')) #返回属性值
6
True
6
6
02、改
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
print(areas)
return areas
a = Rectangle(6, 3)
a.aaa = 'aaa'
setattr(a, 'aaa', '123')
print(a.aaa)
a.__setattr__('aaa', 848839)
print(a.aaa)
123
848839
03、增
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
print(areas)
return areas
a = Rectangle(6, 3)
a.aaa = 123
print(a.aaa)
setattr(a, 'bbb', 'qhjjj')
print(a.bbb)
123
qhjjj
04、删
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
print(areas)
return areas
a = Rectangle(6, 3)
delattr(a, 'length')
print(hasattr(a, 'length'))
False
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
print(areas)
return areas
a = Rectangle(6, 3)
a.__delattr__('length')
print(hasattr(a, 'length'))
False
3、描述符 在一个类里实例化另一个类
class MyClasss:
def __get__(self, instance, owner):
return '2233'
class A:
m = MyClasss()
a = A()
print(a.m)
2233
4、装饰器
1装饰器的本质是闭包
2在不改变代码本身的情况下去给代码添加新功能进去
def a1():
# print('------正在验证----')
print('=====正在登陆======')
# print('-----验证成功------')
def f1(func):
def f2():
print('------正在验证----')
func()
print('-----验证成功------')
return f2
a = f1(a1)
a()
------正在验证----
=====正在登陆======
-----验证成功------
def f1(func):
def f2():
print('------正在验证----')
func()
print('-----验证成功------')
return f2
@f1 #装饰器
def a1():
# print('------正在验证----')
print('=====正在登陆======')
# print('-----验证成功------')
a1()
------正在验证----
=====正在登陆======
-----验证成功------
2、内置装饰器
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
@property # 像访问属性一样访问
def area(self):
areas = self.length * self.width
print(areas)
return areas
@staticmethod # 静态方法装饰器
def func():
print('func')
@classmethod #类方法装饰器
def func2(cls):
print(cls)
print('func2')
a = Rectangle(2, 5)
a.area
a.func()
a.func2()
10
func
<class '__main__.Rectangle'>
func2