如何在Python中跨类和跨文件访问属性?

如何在Python中跨类和跨文件访问属性?,python,tornado,Python,Tornado,现在我需要一个属性,它在另一个类中执行某个类中的操作 就像: a.py class A: def __init__(self, io_loop): # the same io_loop instance self.access = None self.w_id = None self.io_loop = io_loop @gen.coroutine def setup(self): #

现在我需要一个属性,它在另一个类中执行某个类中的操作

就像:

a.py

class A:
    def __init__(self, io_loop):         # the same io_loop instance 
        self.access = None
        self.w_id = None
        self.io_loop = io_loop

    @gen.coroutine
    def setup(self):
        # `async_client` has the `get`, 'post', 'put', 'delete' methods 
        self.access = yield async_client()

    @gen.coroutine
    def do_something(self):
        self.w_id = self.access.get('w_id')
        ...

    def run(self):
        self.io_loop.run_sync(self.setup)
        self.io_loop.spawn_callback(self.do_something)
        self.io_loop.start()

if __name__ == '__main__':
    a = A()
    a.run()
-

注意

B类
的区域id不是无时,
B类
可以执行下一步操作。这意味着,如果
class A
zone\u id为None,
class B
将等待它

class A
class B
只能初始化一个实例


不同文件中的
类A
类B

在创建初始化的实例之前,无法访问该变量。否则,
A
中不存在
w\u id

如果您想给
w_id
一个任意值,以便从其他类进行访问,请将其作为类变量,这意味着您直接在类
a
中使用与
def
s相同的缩进写入
w_id='some value'

class A:
    w_id = something
    def __init__(self):
        ...
class B:
    def __init__(self):
        self.w_id = A.w_id
否则,您需要一个
A
的实例,如下所示:

class B:
    def __init__(self):
        a = A()
        a.do_something()
        self.w_id = a.w_id
唯一的其他选项是在
B
中创建相同的函数:

class B:
    ...
    @gen.coroutine 
    def setup(self): 
        # `async_client` has the `get`, 'post', 'put', 'delete' methods
        self.access = yield async_client()   
    @gen.coroutine 
    def do_something(self): 
        self.w_id = self.access.get('w_id') 
        ...

正如您提到的,io_循环在所有类中都是同一个实例,如果您的函数使用它,则可能需要创建它的副本。你不能改变一个变量而期望它保持不变

在创建初始化的实例之前,无法访问该变量。否则,
A
中不存在
w\u id

如果您想给
w_id
一个任意值,以便从其他类进行访问,请将其作为类变量,这意味着您直接在类
a
中使用与
def
s相同的缩进写入
w_id='some value'

class A:
    w_id = something
    def __init__(self):
        ...
class B:
    def __init__(self):
        self.w_id = A.w_id
否则,您需要一个
A
的实例,如下所示:

class B:
    def __init__(self):
        a = A()
        a.do_something()
        self.w_id = a.w_id
唯一的其他选项是在
B
中创建相同的函数:

class B:
    ...
    @gen.coroutine 
    def setup(self): 
        # `async_client` has the `get`, 'post', 'put', 'delete' methods
        self.access = yield async_client()   
    @gen.coroutine 
    def do_something(self): 
        self.w_id = self.access.get('w_id') 
        ...


正如您提到的,io_循环在所有类中都是同一个实例,如果您的函数使用它,则可能需要创建它的副本。你不能改变一个变量而期望它保持不变

B
是否可以引用类
a
?这是代码气味,但您可以简单地将
w_id
作为类变量,因此
a.w_id
无处不在。@shuttle87但
类a
本身需要初始化。而且只有一个instance@juanpa.arrivillaga
w\u id
不是类变量…@agnewee是的,我是说让它成为类变量。类
B
可以引用类
a
吗?这是代码气味,但你可以简单地将
w\u id
作为类变量,所以
A.w\u id
无处不在。@shuttle87但是
A类本身需要初始化。而且只有一个instance@juanpa.arrivillaga
w\u id
不是类变量…@agnewee是的,我是说将其设为类变量。@agnewee如果启动b.py并导入a.py,那么之前不会创建a的实例,因为
\uu name\uuuu=''\uuu main\uuuuuu'
只会在b.py中触发。a、 py仅作为库导入。事实上,
a
B
使用相同的
ioloop
实例,因此在上下文中,它们已经存在实例…因此添加一个类变量。正如我提到的,在初始化发生之前,A中的w_id将不存在,您不允许这样做。然而,有一种方法。我现在添加了,我尝试了一下,但是没有效果。在
a.py
中,我声明了一个类变量
W_ID=None
,然后在
b.py
处从导入a
。在
b.py
中,A.W\u ID始终是
None
。只是更新了它。当然,您需要保存一个实例,以便更改变量。您不能在运行时更改泛型类内的值。@agnewee如果启动b.py并导入a.py,那么之前将不会创建a的实例,因为
\uuuuuuu name\uuu='\uuuuu main\uuuu'
将仅在b.py中触发。a、 py仅作为库导入。事实上,
a
B
使用相同的
ioloop
实例,因此在上下文中,它们已经存在实例…因此添加一个类变量。正如我提到的,在初始化发生之前,A中的w_id将不存在,您不允许这样做。然而,有一种方法。我现在添加了,我尝试了一下,但是没有效果。在
a.py
中,我声明了一个类变量
W_ID=None
,然后在
b.py
处从导入a。在
b.py
中,A.W\u ID始终是
None
。只是更新了它。当然,您需要保存一个实例,以便更改变量。不能在运行时更改泛型类内的值。