2017-09-19 11 views
0

私はPythonを初めて使用しています。私は、オブジェクトの作成のみを許可するクラスを作成しようとしています。私はカウントを追跡するためにプライベート変数インスタンスを使用しています。 マイコード - NameError:名前 's'が定義されていません

class s: 
    __instance=2 

    if s.__instance<2: 
     def __init__(self,x): 
      s._instance = x 
      s._instance = s._instance+1 
      print(s._instance) 

a=s(5) 

私が得たコードを実行

-

"C:\Users\PIYU\AppData\Local\Programs\Python\Python36\python.exe" 
"C:/Users/PIYU/PycharmProjects/PythonProgram/singleton.py" 
    Traceback (most recent call last): 
    File "C:/Users/PIYU/PycharmProjects/PythonProgram/singleton.py", line 1, in <module> 
    class s: 
    File "C:/Users/PIYU/PycharmProjects/PythonProgram/singleton.py", line 4, in s 
    if s.__instance<2: 
    NameError: name 's' is not defined 
+0

のためだけ糖衣構文であるここはかなりの数の他の質問の重複だが、私は今のものを見つけることができません - 誰かが投票をして質問を終わらせてください。 –

+0

関連する[documentation](https://docs.python.org/3/tutorial/classes.html#class-definition-syntax) –

+0

@bruno desthuilliersすべての敬意をもって私はすべての同様の質問を行ってきました。 –

答えて

5

それが実際に定義される前に、あなたは、それ自身の定義でsを参照しようとしているため、エラーがあります。私はその前にではなく__init__でその条件を使用しようとします。

+0

OPが何をしようとしているのか@AlexanderReynolds、クラス属性を使うことは理にかなっています。 –

1

classは、新しいclassクラスオブジェクトを作成し、それを囲みスコープ内のクラス名にバインドする実行可能ステートメントです。文全体が実行されるまで(IOW、class文ブロックまで)、クラスオブジェクトは存在せず、名前は定義されません。この物事をより明確にするために

は、:

class Foo(object): 
    bar = 42 
    def foo(self): 
     print "foo" 

が実際に

def foo(self): 
    print "foo" 

Foo = type("Foo", (object,), {"foo": foo, "bar": 42}) 
del foo # remove the name from current scope 
+0

私はそれ自身の内部でクラスを参照することはまだ可能であると信じて、あなたはブロック内の文の順序に注意する必要があります。 [Eg.](@code.activestate.com/recipes/52558-the-singleton-pattern-implemented-with-python/) –

+0

@AlexanderReynoldsメソッド内からクラスを参照できます。あなたは 'class'文ブロック、period内でそれを参照することはできません。 –

+0

ああ、私は、 'クラス'のブロックスコープはメソッドに拡張されていない参照してください。 –