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

“我再次检查过,这是因为我从 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 回答
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。现在我有了一个对象,我可以得到对象范围变量。这相当于 Goranek 的回答。

在我之前的示例中,您试图在obj1.a没有obj1类似的情况下访问。如果不把它变成一篇关于 OO 和 Python 类型系统的介绍性文章,我真的不确定如何让这个更清楚。

于 2012-12-23T20:27:30.457 回答
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 回答