Как перенаправить вызовы метода в python? - PullRequest
1 голос
/ 22 апреля 2020

Я понимаю, что вы можете использовать __getattr__() для доступа к атрибутам, которые не существуют как атрибуты этого класса. Однако я хотел сделать то же самое с функциями.

Я читал, что python обрабатывает атрибуты и методы одинаково, поэтому вы также используете __getattr__() для методов. Это правда?

class container:
    def __init__(self, data):
        self.data = data

    def __getattr__(self, item):
        ##Don't know the code to put here vv
        result = getattr(self.data, item)


class data:
    def printHello(self):
        print("hello")

    def printString(self, string):
        print(string)

def main():
    someData = data()
    someContainer = container(someData)
    someContainer.printString("sup")

main()

Цель: Я хочу написать container.printHello() и заставить его вызвать container.data.printHello(). Я также хотел бы получить решение, которое позволило бы передавать параметры в printString(). Как бы я go об этом?

ПРИМЕЧАНИЕ: это упрощение. На самом деле, у меня есть огромное количество методов, которые я постоянно добавляю, удаляю и изменяю имена методов при разработке своей программы

Ответы [ 3 ]

3 голосов
/ 22 апреля 2020

У вас это есть, вам просто нужно вернуть то, что у вас было.

class Container:
    def __init__(self, data):
        self.data = data
    def __getattr__(self, attr):
        return getattr(self.data, attr)

class Data:
    def print_hello(self):
        print("hello")

    def print_string(self, string):
        print(string)


Container(Data()).print_hello()
Container(Data()).print_string('foo')
2 голосов
/ 22 апреля 2020

Может, ты забыл вернуть свой результат? Это работает для меня:

def __getattr__(self, item): 
    return getattr(self.data, item)
1 голос
/ 22 апреля 2020

Все, что вам нужно сделать, это вернуть найденный вами атрибут.

"""
Tests

>>> c = container(data())
>>> c.printHello()
hello
>>> c.printString("Hello World")
Hello World
>>> c.printGarbage('Hello World')
Traceback (most recent call last):
  File "cont.py", line 19, in __getattr__
    result = getattr(self.data, item)
AttributeError: 'data' object has no attribute 'printGarbage'
"""

import functools

class container:
    def __init__(self, data):
        self.data = data

    def __getattr__(self, item):
        result = getattr(self.data, item)
        return result

class data:
    def printHello(self):
        print("hello")

    def printString(self, string):
        print(string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...