PythonPython全栈

28.Python之内置的魔术方法

2020-03-13  本文已影响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)
      
上一篇 下一篇

猜你喜欢

热点阅读