特殊方法

特殊方法
  特殊方法:Python预定义了一些特殊方法,这些特殊的方法与通常的方法有以下不同:
  1. 名称上,特殊方法以双下划线开头和结尾。例如:__init__()、__new__();
  2. 调用方式上,特殊方法通常不会显示调用,而是在特定情况下自动被调用;
  3. 功能上,特殊方法预定义了特定的功能,而普通方法用户可以自定义方法的功能;
  4. 定义上,特殊方法是Python预定义的,用户根据需要进行重写,而普通方法需要用户显示定义。

__init__()

  方法__init__()在实例创建之后,返回调用者之前被自动调用,通常用来对实例的属性进行初始化。
  下面是使用__init__()的简单例子:

# -*- coding: utf-8 -*-

class Student():
    '''
    定义一个学生类Student
    '''
    def __init__(self, name, scope):
        print('Enter __init__().')
        self.name = name
        self.scope = scope
        print('Exit __init__().')
        
student = Student('Lucy', 85) # 创建Student实例之后,返回给变量student之前自动调用了方法__init__()

__new__()

  方法__new__()在创建实例的时候被自动调用。
  __new__()的参数比较特殊,它的第一个参数的cls,即创建实例所使用的类。
  __new__()应该返回cls的实例,这个实例会传递给__init__(self, ...)中的self。如果__new__()没有返回一个实例,那么__init__()就不会被调用。
  下面是使用__new__()的简单例子:

# -*- coding: utf-8 -*-

class Student():
    '''
    定义一个学生类Student
    '''
    def __new__(cls, name, scope):
        print('Enter __new__().')
        instance = super().__new__(cls)
        
        return instance             # 如果不返回实例,那么__init__()不会被调用
        
        print('Exit __new__().')    # 不会执行到此语句
        
    def __init__(self, name, scope):
        print('Enter __init__().')
        self.name = name
        self.scope = scope
        print('Exit __init__().')
        
student = Student('Lucy', 85) # 创建Student实例时会自动调用方法__new__()

__str__()

  方法__str__()在使用实例作为实参调用str()、format()、print()时会自动被调用。__str__()返回的是一个string实例,用来表示一个实例的信息。
  下面是使用__str__()的简单例子:

# -*- coding: utf-8 -*-

class Student():
    '''
    定义一个学生类Student
    '''
    def __init__(self, name, scope):
        print('Enter __init__().')
        self.name = name
        self.scope = scope
        print('Exit __init__().')
        
    def __str__(self):
        return ('My name is: %s.' % self.name)
        
student = Student('Lucy', 85) # 创建Student实例之后,返回给变量student之前自动调用了方法__init__()
print(student)                 # 调用print()打印实例时,实际上会调用__str__(),将其返回的字符串打印出来