2

我有一种dict不同的类型,我想根据实际参数的名称为其添加一个简单的 getter。

例如,对于三个存储参数,假设:

self.storage = {'total':100,'used':88,'free':1}

我现在正在寻找一种方法(如果可能的话?)用一些元编程魔法即时生成一个函数。

代替

class spaceObj(object):
    def getSize(what='total'):
      return storage[what]

或硬编码

@property
def getSizeTotal():
  return storage['total']

class spaceObj(object):
# manipulting the object's index and magic
@property
def getSize: 
    return ???

这样mySpaceObj.getSizeFree就可以派生调用- getSize 仅在对象中定义一次,并且通过操作对象函数列表从它派生相关函数。

这样的事情可能吗?

4

3 回答 3

5

虽然当然可以从类中获取未知属性作为属性,但这不是一种 Python 方法(__getattr__魔术方法更像是 ruby​​ist)

class spaceObj(object):
    storage = None

    def __init__(self):  # this is for testing only
        self.storage = {'total':100,'used':88,'free':1}

    def __getattr__(self, item):
        if item[:7] == 'getSize':  # check if an undefined attribute starts with this
            return self.getSize(item[7:])

    def getSize(self, what='total'):
        return self.storage[what.lower()]

print (spaceObj().getSizeTotal)  # 100
于 2013-10-09T15:19:46.490 回答
2

您可以将值作为属性放入对象中:

class SpaceObj(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

storage = {'total':100,'used':88,'free':1}
o = SpaceObj(**storage)
print o.total

或者

o = SpaceObj(total=100, used=88, free=1)
print o.total

或使用__getattr__

class SpaceObj(object):
    def __init__(self, **kwargs):
        self.storage = kwargs

    def __getattr__(self,name):
        return self.storage[name]

o = SpaceObj(total=100, used=88, free=1)
print o.total

后一种方法需要更多的代码,但更安全;如果您有一个方法foo并且有人使用 创建实例SpaceObj(foo=1),那么该方法将被第一种方法覆盖。

于 2013-10-09T15:19:08.707 回答
-2
>>> import new
>>> funcstr = "def wat(): print \"wat\";return;"
>>> funcbin = compile(funcstr,'','exec')
>>> ns = {}
>>> exec funcbin in ns
>>> watfunction = new.function(ns["wat"].func_code,globals(),"wat")
>>> globals()["wat"]=watfunction
>>> wat()
wat
于 2013-10-09T15:25:41.463 回答