Skip to main content
 首页 » 编程设计

python之在 python 中重定向函数定义

2025年05月04日14xing901022

将类方法指向实例方法显然会导致问题:

class A(dict):           
    def __getitem__(self, name): 
        return dict.__getitem__(self, name) 
 
class B(object): 
    def __init__(self): 
        self.a = A() 
        B.__getitem__ = self.a.__getitem__  
 
b1 = B() 
b1.a['a'] = 5 
b2 = B() 
b2.a['b'] = 10 
 
c = b1['a'] 
d = b2['b'] 

给出这个错误:

  File ... in __getitem__ 
    return dict.__getitem__(self, name) 
KeyError: 'a' 

我应该在这里做什么?

请您参考如下方法:

__getitem__ 只在类里面起作用。您不能在实例基础上覆盖它。

这个有效:

class A(dict):                   
    def __getitem__(self, name): 
        return dict.__getitem__(self, name) 
 
class B(object): 
    def __init__(self): 
        self.a = A() 
 
    def __getitem__(self, item): 
        return self.a[item] 
 
b1 = B() 
b1.a['a'] = 5 
b2 = B() 
b2.a['b'] = 10 
 
c = b1['a'] 
d = b2['b'] 

如果你出于某种奇怪的原因想在__init__中定义它,你必须创建一个描述符:

def __init__(self): 
    self.a = A() 
    def mygetitem(self, item): 
        return self.a[item] 
    B.__getitem__ = types.MethodType(mygetitem, None, B)