我正在尝试在其他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'
由于
答案 0 :(得分: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
。
如果有其他方法可以接收类的实例,则无需导入类本身。
答案 1 :(得分: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类型系统的介绍性文章。
答案 2 :(得分:3)
class Names:
def userNames(self):
self.name = 'Richard'
import a
c = a.Names()
c.userNames()
what_you_want_is = c.name
顺便说一句,这段代码毫无意义..但这显然是你想要的
class Names:
def userNames(self, name):
self.name = name
import a
c = a.Names()
c.userNames("Stephen or something")
what_you_want_is = c.name
# what_you_want_is is "Stephen or something"