Перенаправление определений функций в Python

StackOverflow https://stackoverflow.com/questions/686899

  •  22-08-2019
  •  | 
  •  

Вопрос

Указание метода класса на метод экземпляра явно вызывает проблемы:

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top