gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:35:16 24 4
gpt4 key购买 nike

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

我想使用属性重新实现具有更 pythonic 接口(interface)的类。问题是每个类都有数百个 getter 和 setter 而我有很多类。如何自动创建属性?

例如,如果我有一个名为 MyClass 的类,带有 GetX()SetX(x)GetYSetY 等...方法,如何自动创建具有属性 X 的派生类 MyPythonicClass(如果存在则可读如果有 setter,getter 和 writable 是什么)等等?我想要一种机制,让我可以选择跳过一些 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 - 从 getter/setter 到属性的自动转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com