美文网首页PythonPython全栈
28.Python之内置的魔术方法

28.Python之内置的魔术方法

作者: 免跪姓黄 | 来源:发表于2020-03-13 23:52 被阅读0次

    Python之内置的魔术方法

    1. __call__方法

      • 在调用对象时(实例化的对象加括号),会自动触发类中的__call__方法。一个对象能不能在后面加括号调用,就看这个对象所在的这个类中有没有__call__方法。

        class Foo(object):
            def __call__(self, *args, **kwargs):
                print('自动触发__call__方法')
        
        foo = Foo()
        foo()   # 自动触发__call__方法
        
    2. __len__方法

      • 使用len(obj)时,会自动触发类中的__len__方法。需要实现len(obj)这种用法时,类中就一定要有__len__方法。

        class Foo(object):
            def __init__(self):
                self.list = []
        
            def __len__(self):
                return len(self.list)
        
        
        foo = Foo()
        foo.list.append(1)
        foo.list.append(2)
        foo.list.append(3)
        print(len(foo.list))    # 3
        
    3. __new__方法

      • __new__是一个构造方法,在实例化对象时为对象开辟的空间,创建的类指针,用的就是__new__方法。__new__方法常见于单例模式,即无论实例化多少次,都只开辟一次空间。

        class Foo(object):
            __identification = None
            def __new__(cls, *args, **kwargs):
                if cls.__identification is None:
                    cls.__identification = object.__new__(cls)
                return cls.__identification
        
            def __init__(self, name, age):
                self.name = name
                self.age = age
        
        
        foo_1 = Foo('A', 1)
        print(foo_1)    # <__main__.Foo object at 0x000001D0B98D6C10>
        foo_2 = Foo('B', 2)
        print(foo_2)    # <__main__.Foo object at 0x000001D0B98D6C10>
        
        # 注意:在Python中通过模块导入是实现单例模式最简单的方法。
        
    4. __str__方法

      • 在print对象时,自动触发__str__方法,并且必须返回一个字符串类型。__repr____str__功能相似,用str(obj)时,总是优先调用__str__方法,当,__str__不存在,则会调用__repr__方法;用repr(obj)时,调用__repr__方法,__repr__方法不存在,则返回对象的内存地址。

        class User():
           def __init__(self, name, age, sex):
              self.name = name
              self.age = age
              self.sex = sex
        
           def __str__(self):    # 当执行print(obj)时会自动执行 __str__() 方法
              return F'<姓名:{self.name} 年龄:{self.age} 性别:{self.sex}>'
        
        obj = User('Python',18,'male')
        print(obj)    # 此时相当于调用print(obj.__str__())
        
    5. __del__方法

      • 在对象被删除时,自动触发执行,可用于回收系统资源,也称为"析构函数"。

        class MySQL(object):
           def __init__(self, ip, port):
              self.ip = ip
              self.port = port
              self.conn = connect(ip, port)    # 模拟连接,需要申请系统资源
        
           def __del__(self):
              self.conn.close()    # 当Python程序执行完毕后,会清空所有Python占用的内存,但不会回收系统占用的内存,此时self.conn被删除后,触发 __del__() 的执行,回收系统资源
        
        obj = MySQL('127.0.0.1', 3306)
        

    相关文章

      网友评论

        本文标题:28.Python之内置的魔术方法

        本文链接:https://www.haomeiwen.com/subject/dliushtx.html