2021-03-13

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值