2011-08-11 8 views
10

だけのpythonを学び始めて、私はその愚かな質問が、私はこのような何かしようとしていると確信しています: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 

私は、私はそれを読んでいくつかのコードでの異なる方法の変数を参照するために、自己のステートメントを使用して、この方法が正常に動作して見ました。ヘルプ

+0

をクラスベースにあなたの別々の機能を変換します。 – Yajushi

答えて

23

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() 

をさらに参照のDive into PythonClasses chapter of the Python tutorialを見てください。 Pythonのself

2

は、メソッドが上と呼ばれていた、常にインスタンスであるクラスのインスタンスメソッドの最初の引数に与えられた従来の名称である:

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

a = A() 
a.f() 

あなた

<__main__.A object at 0x02A9ACF0> 
のようなものを与えます
0

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

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

1

あなたは、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 guide

2

それがあるべきようなもの:

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() 
関連する問題