国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python中的__init__ 、__new__、__call__小結(jié)

2019-11-25 18:26:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.__new__(cls, *args, **kwargs)  創(chuàng)建對(duì)象時(shí)調(diào)用,返回當(dāng)前對(duì)象的一個(gè)實(shí)例;注意:這里的第一個(gè)參數(shù)是cls即class本身
2.__init__(self, *args, **kwargs) 創(chuàng)建完對(duì)象后調(diào)用,對(duì)當(dāng)前對(duì)象的實(shí)例的一些初始化,無(wú)返回值,即在調(diào)用__new__之后,根據(jù)返回的實(shí)例初始化;注意,這里的第一個(gè)參數(shù)是self即對(duì)象本身【注意和new的區(qū)別】
3.__call__(self,  *args, **kwargs) 如果類實(shí)現(xiàn)了這個(gè)方法,相當(dāng)于把這個(gè)類型的對(duì)象當(dāng)作函數(shù)來(lái)使用,相當(dāng)于 重載了括號(hào)運(yùn)算符
 

看具體的例子:

復(fù)制代碼 代碼如下:

class O(object):

    def __init__(self, *args, **kwargs):
        print "init"
        super(O, self).__init__(*args, **kwargs)

    def __new__(cls, *args, **kwargs):
        print "new", cls
        return super(O, cls).__new__(cls, *args, **kwargs)

    def __call__(self,  *args, **kwargs):
        print "call"
      

    oo = O()
    print "________"
    oo() 


打印出來(lái)的是:
復(fù)制代碼 代碼如下:

new
init
________
call

比如:Python Singleton(單例模式)實(shí)現(xiàn),那我們是不是只是重載一些__new__方法就可以了
復(fù)制代碼 代碼如下:

class Singleton1(object):
    """ 重載new方法"""
    def __new__(cls, *args, **kwargs):
        if not "_instance" in vars(cls):
            cls._instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
        return cls._instance

可不可以重載__init__方法呢?明顯不可以,因?yàn)開_init__之前調(diào)用了__new__方法,這時(shí)候已經(jīng)生成了一個(gè)對(duì)象了,沒(méi)辦法實(shí)現(xiàn)單例模式

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宝山区| 高清| 江北区| 宣恩县| 平罗县| 衢州市| 蓝山县| 德保县| 革吉县| 剑川县| 自贡市| 会同县| 大安市| 交口县| 囊谦县| 临桂县| 辽宁省| 习水县| 敦化市| 绥阳县| 石河子市| 上林县| 大城县| 青神县| 娱乐| 昆山市| 芦溪县| 潮安县| 蒲江县| 鲁山县| 甘谷县| 临夏市| 谢通门县| 潢川县| 巴中市| 邵武市| 轮台县| 南澳县| 正宁县| 丽水市| 吉安县|