zoukankan      html  css  js  c++  java
  • 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
    """
    
  • 相关阅读:
    【自动化学习】自动化误区
    【uwsgi】Mac下python dyld :Library not loaded 问题解决
    【Mysql】Mac版本navicat premium彻底卸载的终端命令:
    【Mysql学习】锁
    【Pytest学习】重复执行用例插件之pytestrepeat的详细使用
    【Python学习】异常传递
    【Jenkins学习】gitlab自动化触发jenkins任务
    一封程序员的情书
    UNION的使用
    为生成的新行添加默认值
  • 原文地址:https://www.cnblogs.com/qlshine/p/6049457.html
Copyright © 2011-2022 走看看