zoukankan      html  css  js  c++  java
  • 飘逸的python

    __new__: 对象的创建,是一个静态方法。第一个參数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)

    __init__ : 对象的初始化, 是一个实例方法,第一个參数是self

    __call__ : 对象可call。注意不是类,是对象。


    先有创建,才有初始化。即先__new__,而后__init__。

    上面说的不好理解,看样例。

    对于__new__

    class Bar(object):
        pass
    
    class Foo(object):
        def __new__(cls, *args, **kwargs):
            return Bar()
    
    print Foo()
    

    能够看到,输出来是一个Bar对象。

    __new__方法在类定义中不是必须写的。假设没定义,默认会调用object.__new__去创建一个对象。假设定义了。就是override,能够custom创建对象的行为。

    聪明的读者可能想到,既然__new__能够custom对象的创建,那我在这里做一下手脚,每次创建对象都返回同一个。那不就是单例模式了吗?没错,就是这样。能够观摩《飘逸的python - 单例模式乱弹

    定义单例模式时。由于自己定义的__new__重载了父类的__new__。所以要自己显式调用父类的__new__。即object.__new__(cls, *args, **kwargs),或者用super()。,不然就不是extend原来的实例了,而是替换原来的实例。


    对于__call__

    class Foo(object):
        def __call__(self):
            pass
    
    f = Foo()#类Foo可call
    f()#对象f可call
    


    总结,在python中。类的行为就是这样。__new__、__init__、__call__等方法不是必须写的,会默认调用,假设自定义了。就是override,能够custom。既然override了,通常也会显式调用进行补偿以达到extend的目的

    这也是为什么会出现"明明定义def _init__(self, *args, **kwargs)。对象怎么不进行初始化"这样的看起来诡异的行为。(注,这里_init__少写了个下划线,由于__init__不是必须写的,所以这里不会报错。而是当做一个新的方法_init__)


  • 相关阅读:
    [HAOI2018]苹果树
    [TJOI2013]拯救小矮人
    [SDOI2016]硬币游戏
    一辈子都学不会的有上下界的网络流
    [AHOI2014/JSOI2014]支线剧情
    [JSOI2009]球队收益
    hdu-1856 More is better---带权并查集
    hdu-1325 Is It A Tree?---并查集
    hdu-1272 小希的迷宫---并查集或者DFS
    hdu1213-How Many Tables---基础并查集
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5119124.html
Copyright © 2011-2022 走看看