How can I memoize a class instantiation in Python?

前端 未结 3 1636
抹茶落季
抹茶落季 2020-12-05 04:47

Ok, here is the real world scenario: I\'m writing an application, and I have a class that represents a certain type of files (in my case this is photographs but that detail

3条回答
  •  [愿得一人]
    2020-12-05 05:23

    The parameters to __new__ also get passed to __init__, so:

    def __init__(self, flubid):
        ...
    

    You need to accept the flubid argument there, even if you don't use it in __init__

    Here is the relevant comment taken from typeobject.c in Python2.7.3

    /* You may wonder why object.__new__() only complains about arguments
       when object.__init__() is not overridden, and vice versa.
    
       Consider the use cases:
    
       1. When neither is overridden, we want to hear complaints about
          excess (i.e., any) arguments, since their presence could
          indicate there's a bug.
    
       2. When defining an Immutable type, we are likely to override only
          __new__(), since __init__() is called too late to initialize an
          Immutable object.  Since __new__() defines the signature for the
          type, it would be a pain to have to override __init__() just to
          stop it from complaining about excess arguments.
    
       3. When defining a Mutable type, we are likely to override only
          __init__().  So here the converse reasoning applies: we don't
          want to have to override __new__() just to stop it from
          complaining.
    
       4. When __init__() is overridden, and the subclass __init__() calls
          object.__init__(), the latter should complain about excess
          arguments; ditto for __new__().
    
       Use cases 2 and 3 make it unattractive to unconditionally check for
       excess arguments.  The best solution that addresses all four use
       cases is as follows: __init__() complains about excess arguments
       unless __new__() is overridden and __init__() is not overridden
       (IOW, if __init__() is overridden or __new__() is not overridden);
       symmetrically, __new__() complains about excess arguments unless
       __init__() is overridden and __new__() is not overridden
       (IOW, if __new__() is overridden or __init__() is not overridden).
    
       However, for backwards compatibility, this breaks too much code.
       Therefore, in 2.6, we'll *warn* about excess arguments when both
       methods are overridden; for all other cases we'll use the above
       rules.
    
    */
    

提交回复
热议问题