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
"""


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM