python的__init__幾種方法總結【轉載】

weixin_30354675發表於2018-03-10

__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

"""

 

轉載於:https://www.cnblogs.com/wihelm/p/8537362.html

相關文章