• python的__init__几种方法总结


    参考

    __init__()

    这个方法一般用于初始化一个类
    但是 当实例化一个类的时候, __init__并不是第一个被调用的, 第一个被调用的是__new__

    #!/usr/bin/env python
    # coding:utf-8
    
    class Test(object):
        """
        用于初始化类
        """
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def res(self):
            return (self.a, self.b)
    
    t = Test(100, 200)
    print t.res()
    
    
    """
    (100, 200)
    """
    

    __str__()

    这是一个内置方法, 只能返回字符串, 并且只能有一个参数self

    #!/usr/bin/env python
    # coding:utf-8
    
    class Test(object):
        """
        用于初始化类
        """
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def res(self):
            return (self.a, self.b)
    
        def __str__(self):
            return '这是一个类'
    
    t = Test(100, 200)
    print t.__doc__
    print '-----'
    print t
    
    """
        用于初始化类
        
    -----
    这是一个类
    """
    
    

    __new__()

    • __new__方法是创建类实例的方法, 创建对象时调用, 返回当前对象的一个实例
    • __init__方法是类实例创建之后调用, 对当前对象的实例的一些初始化, 没有返回值

    先看旧式类的例子

    class Test:
        def __init__(self, age=20):
            print '__init__在运行'
            self.age = 20
    
        def __new__(cls):
            print '__new__在运行'
            return super(Test, cls).__new__(cls)
    
    t = Test()
    
    """
    __init__在运行
    """
    

    旧式类没有__new__()方法


    新式类的__new__

    #!/usr/bin/env python
    # coding:utf-8
    
    class Test(object):
        def __init__(self, age):
            print '__init__在运行'
            self.age = age
    
        def __new__(cls, age):
            print '__new__在运行'
            return super(Test, cls).__new__(cls, age)
    
    t = Test(20)
    
    
    """
    __new__在运行
    __init__在运行
    """
    

    上例可以看出__new__是在__init__之前执行的
    上例的执行逻辑:

    • 先执行t = Test(20)
    • 首先执行age参数来执行Test类的__new__()方法, 这个__new__方法会返回Test类的一个实例(通常使用)

    __call__()

    对象通过提供一个__call__(self, *args, *kwargs)方法可以模拟函数的行为, 如果一个对象提供了该方法, 可以向函数一样去调用它

    # -*- coding: utf-8 -*-
    
    class Test(object):
        def __init__(self):
            print 100
    
        def __new__(cls):
            print 200
            return super(Test, cls).__new__(cls)
    
        def __call__(self, x):
            print 300
    
    t = Test()
    t(100)
    
    
    """
    200
    100
    300
    """
    
  • 相关阅读:
    高斯消元(学习笔记)
    离散化(学习笔记)
    并查集(学习笔记)
    模板---负环(学习笔记)
    差分数组 前缀和(学习笔记)
    manacher马拉车算法(学习笔记)
    Java 常用对象-Object类
    Java 值传递和引用传递
    Java 集合-Set接口和三个子类实现
    Java 集合-Arrays工具类的介绍
  • 原文地址:https://www.cnblogs.com/qlshine/p/6049457.html
Copyright © 2020-2023  润新知