0

クラスのデフォルトのインスタンスを取得しようとしています。したい

class Foo():
    def __init__(self):
        ....

    _default = Foo()

    @staticmethod
    def get_default():
        return _default

しかし_default = Foo()、につながるNameError: name 'Foo' is not defined

4

3 に答える 3

5

Fooクラス定義が完了するまで存在しません。ただし、クラス定義ので簡単に参照できます。

class Foo(object):
    def __init__(self):
    # ....

Foo.default_instance = Foo()

また、プレーンな古い属性を優先して余分な getter メソッドを削除したことにも注意してください。

デコレータで問題を解決することもできます:

def defaultinstance(Class):
    Class.default_instance = Class()
    return Class

@defaultinstance
class Foo(object):
    # ...

または、無償で、メタクラスを使用して:

def defaultmeta(name, bases, attrs):
    Class = type(name, bases, attrs)
    Class.default_instance = Class()
    return Class

# Python 2.x usage
class Foo(object):
    __metaclass__ = defaultmeta
    # ...

# Python 3.x usage
class Foo(metaclass=defaultmeta):
    # ...

それぞれの方法を使用するのはいつですか?

  • 1 回限りの事後定義クラス属性割り当てを使用する
  • 無関係な多くのクラスで同じ動作をさせたい場合や、その実装を「隠す」場合は、デコレータを使用します (ただし、ここでは、実際には隠したり、それほど複雑にしたりすることはありません)。
  • 動作を継承可能にしたい場合は、メタクラスを使用してください。:-)
于 2013-11-04T22:52:06.490 に答える
2

まだ存在しないクラスを参照することはできません。クラス定義本体内では、Fooクラスはまだ作成されていません

クラスの作成後に属性を追加します。

class Foo():
    def __init__(self):
        ....

    @staticmethod
    def get_default():
        return Foo._default


Foo._default = Foo()

get_default()静的メソッドも変更する必要があることに注意してください。クラス本体はスコープを形成しないため_default、非ローカル from として到達することはできませんget_default()

しかし、あなたは今、自分自身を何度も繰り返しています。get_default()代わりにクラスメソッドを作成して、繰り返しを少し減らします。

class Foo():
    def __init__(self):
        ....

    @classmethod
    def get_default(cls):
        return cls._default


Foo._default = Foo()

または、最初の呼び出しでデフォルトを作成します。

class Foo():
    def __init__(self):
        ....

    @classmethod
    def get_default(cls):
        if not hasattr(cls, '_default'):
            cls._default = cls()
        return cls._default
于 2013-11-04T22:52:25.857 に答える