python property setter_Python类@property:使用setter但可以逃避getter?

在这种情况下,请勿使用.var。 .var对象是数据描述符,这意味着对instance.var的任何访问都将调用该描述符,而Python将永远不会在实例本身上查找属性。

您有两个选择:使用.var钩子或构建仅实现.var的描述符。

使用.var挂钩

class MyClass(object):

var = 'foo'

def __setattr__(self, name, value):

if name == 'var':

print "Setting var!"

# do something with `value` here, like you would in a

# setter.

value = 'Set to ' + value

super(MyClass, self).__setattr__(name, value)

现在,在读取.var时将使用普通属性查找,但在分配给.var时,将调用.__dict__方法,从而拦截value并根据需要进行调整。

演示:

>>> mc = MyClass()

>>> mc.var

'foo'

>>> mc.var = 'bar'

Setting var!

>>> mc.var

'Set to bar'

setter描述符

setter描述符将仅拦截变量分配:

class SetterProperty(object):

def __init__(self, func, doc=None):

self.func = func

self.__doc__ = doc if doc is not None else func.__doc__

def __set__(self, obj, value):

return self.func(obj, value)

class Foo(object):

@SetterProperty

def var(self, value):

print 'Setting var!'

self.__dict__['var'] = value

请注意,我们需要如何分配给实例.__dict__属性,以防止再次调用setter。

演示:

>>> f = Foo()

>>> f.var = 'spam'

Setting var!

>>> f.var = 'ham'

Setting var!

>>> f.var

'ham'

>>> f.var = 'biggles'

Setting var!

>>> f.var

'biggles'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值