• python之面向对象之魔术方法


    一,魔术方法(魔术方法,特殊方法)https://www.cnblogs.com/nmb-musen/p/10861536.html

    1,__init__作用

    在创建对象的时候自动调用对 创建的对象 进行初始化设置

    2,什么是魔术方法

    在python中像__init__这类双下划线开头和结尾的方法,称之为魔术方法

    注意:魔术方法都是python内部定义的,自己不要去定义__init__这种双下划线开头的方法

    3,创建一个对象的时候,调用的第一个方法是什么?

    __new__方法,创建并返回一个实例对象(存在于父类object中),创建的实例对象让init函数初始化

    在重写new方法时,一定要调用父类的new方法来完成对象的创建,并且将对象返回

    class MyClass(object):
        def __init__(self, name):
            self.name = name
            print('__init__方法调用了')
    
        def __new__(cls, *args, **kwargs):
            print('这个是new方法')
            # 第一种 调用父类方法并返回
            # return super().__new__(cls)
            # 第二种,调用父类object
            return object.__new__(cls)
    
    
    m = MyClass('小鱼')
    print(m.name)

    4,这个__new__方法有什么作用?又在什么时候会调用呢?

    单例模式中会用到

     二,单例模式

    需求:类每次实例化的时候都会创建一个对象,如果要求类只能实例化一次该怎么做?

    class MyTest(object):
        # 设置一个类属性用来记录这个类有没有创建过对象
        instance = None
    
        def __new__(cls, *args, **kwargs):
            if not cls.instance:
                cls.instance = object.__new__(cls)
                return cls.instance
            else:
                return cls.instance
    
    t1 = MyTest()
    t1.name = '小鱼'
    
    t2 = MyTest()
    print(t2.name)
    
    # t1和t2对象的内存地址是一样的
    print(id(t1) == id(t2))

    装饰器实现单例模式

    1,python的内置函数__str__,__repr__,format

    一般str方法是给用户看的,repr调式用的,接近对象创建的内容

    使用print打印时触发__str__方法

    交互环境直接输入变量时触发的时__repr__方法

    注意点:

    重写__str__ __repr__方法时必须要记得写return

    重写__str__ __repr__方法时,return返回的必须是一个字符串对象

    class MyTest:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            print('__str__方法被触发了')
            return self.name
    
        def __repr__(self):
            print('__repr__方法被触发了')
            return '<MyTest.obj-{}>'.format(self.name)
    
    t1 = MyTest('小鱼')
    # 调用__str__方法
    print(t1)
    # 调用__repr__方法
    res = repr(t1)
    print(res)

    内置函数str转换一个对象时,触发对象对应__str__方法

    内置函数format处理对象时,触发对象对应__str__方法

    内置函数repr函数,触发对象的__repr__的方法

    __str__和__repr__触发机制

    总结:

    使用str函数或者print打印对象时会优先触发str方法,没定义str方法的情况下,会再去找repr方法,如果都没有,那么会去找父类的str方法

    使用repr方法或者交互环境下输入变量,会先找自身的repr方法,自身没有repr方法,会再去找父类额repr方法

    2,__call__方法

    在python中万物皆对象,那为甚函数可以被调用,其他对象却不能被调用?

    通过类实现装饰器要用到__call__方法

    class Decorator:
    
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print('这是装饰器里面的功能')
            self.func()
    
    # test = Decorator(test)
    # 1,相当于创建了一个对象,赋值给test
    # 2,test()相当于调用对象,对象如果可以被调用,通过call方法实现
    # 3,创建Decorator对象时传进去的函数会被init方法接收
    
    @Decorator
    def test():
        print('---原来的功能函数---')
  • 相关阅读:
    springcloud概述
    springcloud-微服务架构基础
    TypeScript 教程
    提示工具以及弹出框
    Bootstrap 弹出框(Popover)插件
    JavaScript JSON
    JavaScript常见基础函数
    7种JavaScript代码调试的方法
    Bootstrap 网格系统
    文本元素
  • 原文地址:https://www.cnblogs.com/ella-li/p/13977485.html
Copyright © 2020-2023  润新知