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