web-dev-qa-db-ja.com

pythonグローバル名 'self'は定義されていません

pythonと私はその愚かな質問を確信していますが、私はこのようなものを試しています:

    def setavalue(self):
        self.myname = "harry"

    def printaname():
        print "Name", self.myname     

    def main():
        printname()




    if __name__ == "__main__":
        main() 

私が得ているエラーは次のとおりです:

 NameError: global name 'self' is not defined

私が読んだいくつかのコードで、selfステートメントを使用してさまざまなメソッドの変数を参照し、正常に機能しているこの方法を見ました。

助けてくれてありがとう

15
harry

selfは、クラス内の自己参照です。コードはクラス内にありません。関数のみが定義されています。以下のように、クラスでメソッドをラップする必要があります。メソッドmain()を使用するには、まずクラスのオブジェクトをインスタンス化し、そのオブジェクトで関数を呼び出す必要があります。

さらに、関数setavalue__init___、オブジェクトをインスタンス化するときに呼び出されるメソッド。次のステップはおそらくinitの引数として名前を指定することです。したがって、Nameクラスの任意の名前のオブジェクトを作成できます;)

class Name:
    def __init__(self):
        self.myname = "harry"

    def printaname(self):
        print "Name", self.myname     

    def main(self):
        self.printaname()

if __name__ == "__main__":
    objName = Name()
    objName.main() 

Pythonチュートリアル)のクラスの章 at Pythonに飛び込む を参照してください。

31
Jacob

In Python selfは、クラスのインスタンスメソッドの最初の引数に与えられる従来の名前であり、常にメソッドが呼び出されたインスタンスです。

class A(object):
  def f(self):
    print self

a = A()
a.f()

あなたのようなものを与えます

<__main__.A object at 0x02A9ACF0>
4
Nicola Musatti

次のようになります。

class Person:
   def setavalue(self, name):         
      self.myname = name      
   def printaname(self):         
      print "Name", self.myname           

def main():
   p = Person()
   p.setavalue("harry")
   p.printaname()  
2
Jiri Kriz

Javaなどの言語を使用している場合、selfthisの間に何らかの関連付けを行うことができます。selfはそのメソッドを呼び出したオブジェクトへの参照ですが、最初にクラスを宣言する必要があります。

class MyClass(object)

    def __init__(self)
        #equivalent of constructor, can do initialisation and stuff


    def setavalue(self):
        self.myname = "harry"

    def printaname(self):
        print "Name", self.myname     

def main():
    #Now since you have self as parameter you need to create an object and then call the method for that object.
    my_obj = MyClass()
    my_obj.setavalue() #now my_obj is passed automatically as the self parameter in your method declaration
    my_obj.printname()


if __name__ == "__main__":
    main()

いくつか試してみることができますPythonこちらのような基本チュートリアル: Pythonガイド

1
Bogdan

self名は、クラスインスタンスのインスタンス参照として使用されます。クラスメソッド定義でのみ使用されます。関数では使用しないでください。

また、他の関数またはメソッドからローカル変数を参照することはできません。それを使用してインスタンスまたはクラスの属性のみを参照できます。

0
Keith