Перегрузка члена доступа оператора - PullRequest
0 голосов
/ 30 октября 2019

Есть ли способ перегрузить оператор доступа к элементу в python? Пример (поскольку это может быть проблема XY, я приведу пример, содержащий то, что я хочу сделать):

class A:
    def __someOverload__(self, name, *args):
        if (name == "foo") print("HW!")
a = A()
a.foo()

>>> HW!

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Вы можете попробовать переопределить getattr:

class A:
    def __getattr__(self, name):
        if name == "foo":
            return lambda: print("hi")


>>> a = A()
>>> a.foo()
hi

Более сложный пример:

class A:
    def __getattr__(self, name):
        if name == "foo":
            return lambda *args: print(args)


>>> a = A()
>>> a.foo(1, 2, 3)
(1, 2, 3)
0 голосов
/ 30 октября 2019

Я бы использовал setattr для этой цели:

>>> class A:
>>>   def __init__(self):
>>>     setattr(self, 'foo', lambda: print('foo'))
>>> 
>>> a = A()
>>> a.foo()
foo
0 голосов
/ 30 октября 2019

Можно изменить поведение по умолчанию встроенных функций Python. Нам нужно только определить соответствующий специальный метод в нашем классе.

class Purchase:
    def __init__(self, basket, buyer):
        self.basket = list(basket)
        self.buyer = buyer

    def __len__(self):
        return len(self.basket)

purchase = Purchase(['pen', 'book', 'pencil'], 'Python')
print(len(purchase))

Здесь вывод равен 3. Надеюсь, это может помочь:)

...