python getter setter_python – 从getter / setter到属性的自动转换

我有一个用C语言编写的大型库,有人创建了一个接口,以自动方式在python(2.6)中使用它.现在我有很多带有getter和setter方法的类.真的:我讨厌他们.

我想使用属性重新实现具有更多pythonic接口的类.问题是每个班级都有数百个getter和setter,而且我有很多课程.如何自动创建属性?

例如,如果我有一个名为MyClass的类,带有GetX()和SetX(x),GetY,SetY等等…方法,我如何自动创建一个带有属性X的派生类MyPythonicClass(如果有的话可读)如果有setter,可以使用getter和writeable,等等?我想要一种机制让我选择跳过一些getter / setter夫妇,最好是手工完成工作.

解决方法:

这是使用类装饰器完成此操作的方法

def make_properties(c):

from collections import defaultdict

props=defaultdict(dict)

for k,v in vars(c).items():

if k.startswith("Get"):

props[k[3:]]['getter']=v

if k.startswith("Set"):

props[k[3:]]['setter']=v

for k,v in props.items():

setattr(c,k,property(v.get('getter'),v.get('setter')))

return c

@make_properties

class C(object):

def GetX(self):

print "GetX"

return self._x

def SetX(self, value):

print "SetX"

self._x = value

c=C()

c.X=5

c.X

这是一个稍微复杂的版本,允许您指定要跳过的项目列表

def make_properties(skip=None):

if skip is None:

skip=[]

def f(c):

from collections import defaultdict

props=defaultdict(dict)

for k,v in vars(c).items():

if k.startswith("Get"):

props[k[3:]]['getter']=v

if k.startswith("Set"):

props[k[3:]]['setter']=v

for k,v in props.items():

if k in skip:

continue

setattr(c,k,property(v.get('getter'),v.get('setter')))

return c

return f

@make_properties(skip=['Y'])

class C(object):

def GetX(self):

print "GetX"

return self._x

def SetX(self, value):

print "SetX"

self._x = value

def GetY(self):

print "GetY"

return self._y

def SetY(self, value):

print "SetY"

self._y = value

c=C()

c.X=5

c.X

c.Y=5

c.Y

标签:python,properties,metaprogramming,automatic-properties

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值