python 类装饰器 添加属性_类属性的python全局装饰器

手动解决方案

看起来像是^{}装饰器的用例:class A(object):

def __init__(self):

self.version = "1.0"

self.login = "logged in"

self.login_message = "hello logger"

@property

def logout(self):

return {"1.0": "logged out", "2.0": "logged out 2.0"}[self.version]

@property

def logout_message(self):

return {"1.0": "goodbye logger", "2.0": "goodbye logger 2.0"}[self.version]

现在:

^{pr2}$

自动化解决方案1

如果您有很多这样的属性,您可以自动化一些:class A(object):

def __init__(self):

self.version = '1.0'

self.login = 'logged in'

self.login_message = 'hello logger'

property_attrs = {'logout': {'1.0': 'logged out',

'2.0': 'logged out 2.0'},

'logout_message': {'1.0': 'goodbye logger',

'2.0': 'goodbye logger 2.0'}}

for name, value in property_attrs.items():

setattr(self.__class__, name, property(lambda x: value[x.version]))

现在:>>> a = A()

>>> a.login_message

'hello logger'

>>> a.logout

'goodbye logger'

>>> a.version = '2.0'

>>> a.logout

'goodbye logger 2.0'

自动化解决方案2

“自动解决方案1”在每次生成

A的新实例。这种解决方案避免了这一点,但涉及面更广。

它使用了类修饰符。在property_attrs = {'logout': {'1.0': 'logged out', '2.0': 'logged out 2.0'},

'logout_message': {'1.0': 'goodbye logger', '2.0': 'goodbye logger 2.0'}}

def add_properties(property_attrs):

def decorate(cls):

for name, value in property_attrs.items():

setattr(cls, name, property(lambda self: value[self.version]))

return cls

return decorate

@add_properties(property_attrs)

class A(object):

def __init__(self):

self.version = '1.0'

self.login = 'logged in'

self.login_message = 'hello logger'

现在:>>> a = A()

>>> a.logout

'goodbye logger'

>>> a.version = '2.0'

>>> a.logout

'goodbye logger 2.0'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值