动态生成提供字典键的方法

2024-09-24 06:33:32 发布

您现在位置:Python中文网/ 问答频道 /正文

正在寻找解决方案(不确定是否存在!)以下情况:
起始点是一个字典

^{pr1}$,其中n而不是固定的。
有没有一种方法可以编写一个泛型类,该类将动态生成n方法,这些方法可以在下面的示例中调用:

    class example(dict):  
    example.k1()
    example.k2()
    .
    .
    .
    example.kn()

每个

^{pr3}$where1<=i<=n,应该返回相应的vi

Tags: 方法示例字典example情况动态k2k1
3条回答

您想要的是重写__getattr__函数described here。你知道吗

以你为例:

class example(dict):
    def __getattr__(self, name):
        return lambda: self[name]

这允许您执行以下操作:

e = example()
e["foo"] = 1
print e.foo()
==> 1

与其动态创建这么多方法,不如重写类的__getattr__方法并从中返回一个可调用的:

class Example(dict):
    def __getattr__(self, k):
        if k in self:
            return lambda: self[k]
        raise TypeError('Example object has not attribute {!r}'.format(k))

请注意,对于keys()items()等键,__getattr__不会被调用,因为它们是由__getattribute__本身在类中找到的。最好不要用它们来命名你的钥匙。你知道吗

演示:

>>> d = Example(a=1, b=2, c=3)
>>> d.a()
1
>>> d.b()
2
>>> d.foo()

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    d.foo()
  File "/home/ashwini/py/so.py", line 7, in __getattr__
    raise TypeError('Example object has not attribute {!r}'.format(k))
TypeError: Example object has not attribute 'foo'

我认为向类中动态添加一个方法可以帮助您

class example(object) :
            dict={'k1':'v1','k2':'v2','k3':'v3','kn':'vn'}
            def getvalue(self,key) :
                return self.dict[key]
if __name__=="__main__" :
e = example()
e.method1=e.getvalue     # this is adding a method to example class dynamically.
print e.method1('k1') 
e.method2=e.getvalue
print e.method2('k2')
e.method3=e.getvalue
print e.method3('k3')
e.methodn=e.getvalue
print e.methodn('kn')

这个输出 第1版 第2版 第3版 越南

相关问题 更多 >