2017-12-31 12 views
2

シンプルなプログラムで、シンプルな基本クラスを実装しています。新しいを定義しています。しかし、私はもはやのinitメソッドに引数を送ることはできません - 私は「TypeError例外を:オブジェクトは()パラメータを受け取りません」を取得ないときシングルトン新しいスーパーコールから:pythonのオーバーライド__new__は__init__に引数を送信できません

class Singleton(object): 
    _instances = {} 

    def __new__(cls, *args, **kwargs): 
     print(args, kwargs) 
     if cls._instances.get(cls, None) is None: 
      cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kwargs) 
     return Singleton._instances[cls] 


class OneOfAKind(Singleton): 

    def __init__(self): 
     print('--> OneOfAKind __init__') 
     Singleton.__init__(self) 


class OneOfAKind2(Singleton): 

    def __init__(self, onearg): 
     print('--> OneOfAKind2 __init__') 
     Singleton.__init__(self) 
     self._onearg = onearg 


x = OneOfAKind() 
y = OneOfAKind() 
print(x == y) 
X = OneOfAKind2('testing') 

出力は次のようになります。

() {} 
Traceback (most recent call last): 
    File "./mytest.py", line 29, in <module> 
    x = OneOfAKind() 
    File "./mytest.py", line 10, in __new__ 
    cls._instances[cls] = super(Singleton, cls).__new__(cls,(), {}) 
TypeError: object() takes no parameters 
+0

をあなたはPython 3を使用していますか? – BorrajaX

答えて

0

右、あなたが継承し、superから呼んでいるものですobjectは、任意の引数になりませんので:

In [54]: object('foo', 'bar') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-54-f03d0963548d> in <module>() 
----> 1 object('foo', 'bar') 

TypeError: object() takes no parameters 
0を

あなたはこのような何かをしたい場合は、私が代わりにサブクラスのmetaclassをお勧めしますし、代わりにオブジェクトを作成するための__new__metaclassオーバーライド__call__オーバーライドする:次に

import six ## used for compatibility between py2 and py3 

class Singleton(type): 
    _instances = {} 

    def __call__(cls, *args, **kwargs): 
     if Singleton._instances.get(cls, None) is None: 
      Singleton._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 
     return Singleton._instances[cls] 

@six.add_metaclass(Singleton) 
class OneOfAKind(object): 

    def __init__(self): 
     print('--> OneOfAKind __init__') 

@six.add_metaclass(Singleton) 
class OneOfAKind2(object): 

    def __init__(self, onearg): 
     print('--> OneOfAKind2 __init__') 
     self._onearg = onearg 

:私は想像

In [64]: OneOfAKind() == OneOfAKind() 
--> OneOfAKind __init__ 
Out[64]: True 

In [65]: OneOfAKind() == OneOfAKind() 
Out[65]: True 

In [66]: OneOfAKind() == OneOfAKind2('foo') 
Out[66]: False 
+0

驚くばかり!ありがとう! –

関連する問題