如何在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.arrivillagaw\u id
不是类变量…@agnewee是的,我是说让它成为类变量。类B
可以引用类a
吗?这是代码气味,但你可以简单地将w\u id
作为类变量,所以A.w\u id
无处不在。@shuttle87但是A类本身需要初始化。而且只有一个instance@juanpa.arrivillagaw\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
。只是更新了它。当然,您需要保存一个实例,以便更改变量。不能在运行时更改泛型类内的值。