正在访问的变量的Python魔术方法?

正在访问的变量的Python魔术方法?,python,Python,我正在寻找一个类似于\uuuu get\uuuu方法的神奇方法,但在我的情况下,变量不在另一个类中,我希望类似于: class A(object): def __similar_to_get__(self): print 'called' return self a = A() b = a >>> 'called' 可能吗 我问这个问题的原因是,我正在使用一个python模拟库,假设我正在测试的函数使用URI属性,我想模拟它以在后续调用中返回不同的值。例

我正在寻找一个类似于
\uuuu get\uuuu
方法的神奇方法,但在我的情况下,变量不在另一个类中,我希望类似于:

class A(object):
  def __similar_to_get__(self):
    print 'called'
    return self

a = A()
b = a
>>> 'called'
可能吗

我问这个问题的原因是,我正在使用一个python模拟库,假设我正在测试的函数使用URI属性,我想模拟它以在后续调用中返回不同的值。例如:

class WebService(obj):
  URI = 'http://works.com'

  def dowork(self):
     call_api(self.URI)
为了模拟失败,我正在使用模拟库:

 mock = MagicMock()
 mock.side_effect = ['http://fail.com', 'http://works.com']

 with patch('WebService.URI', mock):
     # do the testing
但问题是,我只能通过调用可调用的
mock()
让mock返回URL,而不仅仅是访问
mock


PS:我是一个模拟的noob。

我没有直接回答我自己的问题,我设法使用一个属性来解决这个问题:

    from dps.px.pxpost import PxPost
    mock = MagicMock()
    mock.side_effect = ['http://doesnotexist', PxPost.URI]

    def URI(self):
        return mock()

    with patch('django.conf.settings.CELERY_ALWAYS_EAGER', True, create=True):
        with patch('dps.px.pxpost.PxPost.URI', property(URI)):
            self.transaction.process()
            for sub_transaction in self.transaction.sub_transactions.all():
                self.assertTrue(isinstance(sub_transaction.state, CompletedSubTransaction))
                self.assertTrue(sub_transaction.transaction_logs.count() > 0)
            self.assertTrue(isinstance(self.transaction.state, CompletedTransaction))

一位同事建议使用property,这是一种替代解决方案。这些方法中的任何一种都有帮助吗@Louis我认为它可能会工作,但不像属性工作那么简单。我理解你的问题,但在python中没有办法做到这一点。仔细想想,它没有理由不在
a=a()
行之后打印
调用的
。在将对象绑定到名称
a
之前,对左侧进行求值并构造对象。因此,从名称绑定的角度来看,执行
a=a()
实际上与
b=a
没有什么不同…@mgilson好的,这很有意义