python-装饰器

描述器和装饰器
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创造梦想。

如果想获取更多有关python的信息,和想玩python制作的小程序,可以关注微信公众号(dreamspy)。我们一起用python改变世界,一起用python创造梦想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值