获取在Python中调用方法的对象

时间:2018-11-16 10:57:32

标签: python

Python中是否有一种方法可以获取对在其上调用方法的对象的引用?

如果可能的话,甚至可以嵌套吗?

my_class.py:

from modules import math_ops

class A():
    def __init__(self):
        self.math_ops = math_ops.B()
        self.number = 1

modules / math_ops.py:

class B():
    def add_1():
        where_to_add = # Get instance of A() object
        where_to_add.number += 1

要执行此操作:

>>> a = A()
>>> a.math_ops.add_1()

并得到这个:

>>> a.number
2

我之所以问是因为我有兴趣编写一个静态方法,该方法可以在调用该方法的对象上使用,但是希望避免使用该对象作为参数,因为调用类似{的方法会更好{1}},而不是my_object.prop.static_method()

2 个答案:

答案 0 :(得分:1)

如果您从不打算在math_ops之外重新分配A,这很简单。

from modules import math_ops

class A():
    def __init__():
        self.math_ops = math_ops.B(self)
        self.number = 1

modules / math_ops.py:

class B():
    def __init__(self, creator):
        self.creator = creator

    def add_1():
        creator.number += 1

如果您略过第一行,我会再次提及,由于B正在跟踪对象的创建者而不是调用者,因此以下内容将产生意外结果。

a1 = A()
a2 = A()
a1.math_ops = a2.math_ops
a1.math_ops.add_1() # a2 is updated

如果这看起来像您想做的事情,那么答案就有点复杂了。这是我的尝试:

from modules import math_ops
class A():
    def __init__(self):
        self._math_ops = math_ops.B(self)
        self.number = 1

    @property
    def math_ops(self):
        self._math_ops.set_caller(self)
        return self._math_ops

    @math_ops.setter
    def math_ops(self, new_math_ops):
        self._math_ops = new_math_ops

modules / math_ops.py:

class B():
    def __init__(self, caller):
        self.caller = caller

    def set_caller(self, caller):
        self.caller = caller

    def add_1(self):
        self.caller.number += 1

答案 1 :(得分:-1)

class A():
   number = 1

class B():
    def add_1():
        where_to_add = A
        where_to_add.number += 1

B.add_1()
print(A.number)
B.add_1()
print(A.number)
B.add_1()
print(A.number)