在Python中创建一个可变交叉模块 - 在类和函数中

时间:2012-12-23 17:28:36

标签: python python-2.7 tornado

我正在尝试在其他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'

由于

3 个答案:

答案 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)

的文件: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"