0

次のように、他のpythonモジュールで変数を使用しようとしています:

a.py

class Names:
    def userNames(self):
        self.name = 'Richard'

z.py

import a
d = a.Names.name
print d

ただし、これは変数を認識せずname、次のエラーが表示されます。

AttributeError: type object 'Names' has no attribute 'name'

ありがとう

4

3 に答える 3

4

変数をバインドできるさまざまなスコープがたくさんありますが、これは混乱しているようです。ここにいくつかあります:

# a.py
a = 1 # (1) is module scope

class A:
    a = 2 # (2) is class scope

    def __init__(self, a=3): # (3) is function scope
        self.a = a           # (4) self.a is object scope

    def same_as_class(self):
        return self.a == A.a # compare object- and class-scope variables

    def same_as_module(self):
        return self.a == a   # compare object- and module-scope variables

ここで、これらのさまざまな変数(a要点を説明するためにすべてを呼び出しただけです。実際にはこれを行わないでください)の名前と、それらすべての値がどのように異なるかを確認してください。

>>> import a
>>> a.a
1 # module scope (1)
>>> a.A.a
2 # class scope (2)
>>> obj1 = a.A() # note the argument defaults to 3 (3)
>>> obj1.a       # and this value is bound to the object-scope variable (4)
3
>>> obj.same_as_class()
False             # compare the object and class values (3 != 2)

>>> obj2 = a.A(2) # now create a new object, giving an explicit value for (3)
>>> obj2.same_as_class()
True

これらの値のいずれかを変更することもできることに注意してください。

>>> obj1.same_as_module()
False
>>> obj1.a = 1
>>> obj1.same_as_module()
True

参考までに、z.py上記はおそらく次のようになります。

import a
n = a.Names()
d.userNames()
d = n.name
print d

a.Nameクラスですが、オブジェクトスコープ変数を参照しようとしているためです。オブジェクトはクラスのインスタンスです:私は自分のインスタンスを呼び出しましたn。これでオブジェクトができました。object-scope変数を取得できます。これはゴラネックの答えに相当します。

obj1.a私の前の例では、あなたはそれのようなものを持たずにアクセスしようとしてobj1いました。これをOOとPythonの型システムの入門エッセイに変えずに、これをより明確にする方法はよくわかりません。

于 2012-12-23T20:27:30.457 に答える
4

「もう一度確認しましたが、Tornado フレームワークからインポートしており、変数がクラス内にあるためです。」

したがって、あなたの問題はあなたの質問に示されているものではありません。

実際にクラスの変数にアクセスしたい場合 (そしておそらくアクセスしたくない場合) は、次のようにします。

from othermodule import ClassName

print ClassName.var_i_want

おそらく、インスタンス内に保持されている変数にアクセスする必要があります。

from othermodule import ClassName, some_func

classnameinstance = some_func(blah)
print classnameinstance.var_i_want

更新質問を完全に変更したので、新しい質問への回答を次に示します。

このコードでは:

class Names:
    def userNames(self):
        name = 'Richard'

nameメソッドのアクティベーション以外でアクセスできる変数ではありませんuserNames。これは、ローカル変数として知られています。コードを次のように変更して、インスタンス変数を作成します。

def userNames(self):
        self.name = 'Richard'

次に、という変数にインスタンスがある場合は、次のclassnameinstanceことができます。

print classnameinstance.name

これは、 を呼び出すなどして、変数がインスタンスで既に作成されている場合にのみ機能しますuserNames

クラスのインスタンスを受け取る方法が他にある場合は、クラス自体をインポートする必要はありません。

于 2012-12-23T17:37:41.617 に答える
3

ファイル:a.py

class Names:
    def userNames(self):
        self.name = 'Richard'

ファイル:z.py

import a
c = a.Names()
c.userNames()
what_you_want_is = c.name

ところで、このコードは意味がありません..しかし、これは明らかにあなたが望むものです

より良い a.py

class Names:
    def userNames(self, name):
        self.name = name

より良い z.py

import a
c = a.Names()
c.userNames("Stephen or something")
what_you_want_is = c.name 
# what_you_want_is is "Stephen or something"
于 2012-12-23T17:52:06.873 に答える