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