python的__init__几种方法总结

时间:2023-03-08 17:25:27

参考

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