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

"""

 

转载于:https://www.cnblogs.com/wihelm/p/8537362.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值