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

时间:2016-09-18 03:31:02

标签: 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):
        # `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.py

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

    # How can i get the w_id from `class A`     

    def run(self):
        ... 

if __name__ == '__main__':
    b = B()
    b.run() 

通知

class B的zone_id不是None时,class B可以执行下一步操作。这意味着,如果class A zone_id为无,class B将等待它。

class Aclass B只能初始化一个实例。

不同文件中的class Aclass B

1 个答案:

答案 0 :(得分:0)

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

如果要为其他类提供w_id任意值,请将其作为类变量,意味着直接在类w_id = 'some value'内编写A,并使用相同的缩进作为def s:

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_loop在所有类中都是相同的实例,如果您的函数使用它,您可能需要创建它的副本。您无法更改变量并期望它保持不变。