描述器和装饰器
1.__new__单例模式
如果不想把实例弄在两个不同的空间,可以使用new来改变
class Earth:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'): # 如果我的类没有实例对象,那我就去new一个实例对象
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
self.name = 'earth'
e = Earth()
print(e)
a = Earth()
print(a)
2.定制属性(增删改查)
1.增
one.num = 1
#(据点法)
#魔术方法给了我们一个自定义的接口,函数的执行底层其实就是去调用了魔术方法。
setattr(one."num",2)#设置属性
one.__setattr("num",3)
2.查
print(hasattr(one, num.txt)) # 是否有该属性,返回布尔值
print(getattr(one, num.txt)) # 获取属性值
print(one.__getattribute__(num.txt)) # 获取属性值
3.改
setattr(one, 'num1', 66) # 无则增
setattr(one, 'num', 88) # 有则改
one.__setattr__("num2", 55) # 无则增,有则改
one.__setattr__("num", 66)
print(one.num)
print(one.num2)
4.删
del one.num
delattr(one, "num2")
one.__delattr__("num2")
5.自定义
class Rectangle: # 矩形类:正方形、长方形
def __init__(self, length, width): # __init__实例化对象时自动调用
self.length = length
self.width = width
def __getattr__(self, item):
return "no attribute" # 当属性不存在时,调用此方法,如果没有定义此方法报错
def area(self):
areas = self.length * self.width
return "面积是:{}".format(areas)
a = Rectangle(66, 88)
a.num = 1 #如果没有定义将调用__getattr方法
print("有属性:", a.length)
print(a.num)
3.描述符
上一个实例对象拿来做这一个类的类熟悉,这就是描述符
类里面实例化另一个类,对这个实例做访问的时候,需要定义__get__,set,__delete__方法来实现属性的增删改查
①.查
会去第一个类里面执行__get方法
②.改
会去第一个类里面执行__set方法
③.删除
会去第一个类里面执行__delete方法
4.装饰器
闭包:函数里面嵌套函数,外层函数返回内层函数的函数名
装饰器:本质就是闭包。
不修改原函数的前提下,方便的增加函数功能
用@+想调用的函数名
5.内置装饰器
1.property
可以直接使用,但是又不能随意修改。
2.staticmethod
方法边静态,没有参数绑定无需再方法后面的括号内加self,解绑,无需实例化就可以调用方法,执行效率高。
3.classmethod
方法边类方法
class Cat:
"""这是一个猫类"""
name = '猫'
def __init__(self, color, eat):
self.color = color
self.eat = eat
@property
def print_cat(self):
print("{}-{}".format(self.color, self.eat))
@staticmethod # 方法变静态方法,没有参数绑定
def func():
print("我来测试静态方法")
print("我不需要self参数也能运行")
print("我不需要实例化也能运行")
@classmethod # 类方法
def func1(cls): # cls代表类本身
# def func1(self, cls): # cls代表类本身
print("="*50)
print("我是来测试类方法的")
print(cls)
print(cls.name)
Cat.func() # 解绑,不用实例化就可以调用方法。执行效率高
kitty = Cat('white', 'food')
print(kitty.color)
kitty.color = "hua"
print(kitty.color)
# kitty.print_cat() # 调用类内方法的方式
# 1.property装饰器:方法变属性
# class、instance、property
# 使用起来方便,但是又不能随意去修改
kitty.print_cat
# 2.staticmethod装饰器:方法变静态方法,没有参数绑定
# 只在类本身生效
kitty.func()
Cat.func()
# 3.classmethod装饰器:方法变类方法
kitty.func1()
print("以下是类名.类方法")
Cat.func1()
# 属性:实例是可以调用实例属性、类属性,类只能调用类属性
# 方法:实例是可以调用类内方法、类方法,类只能调用类方法
# Cat.func1(kitty)
6.类作装饰器
class Test:
"""这是一个用来做装饰器的类"""
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("前增加")
self.func(*args, **kwargs) #这里必须为self.func()
print("后增")
如果想获取更多有关python的信息,和想玩python制作的小程序,可以关注微信公众号(dreamspy)。我们一起用python改变世界,一起用python创造梦想。