вы можете определить __repr__ в функции и является ли функция классом? - PullRequest
1 голос
/ 20 января 2020

Если у меня есть функция с именем foo:

def foo():
    return "foo function"

и если видно, что тот факт, что она возвращает строку, даже не вызывая функцию, означает, что __repr__ определено так, как вы можете видеть в этом примере:

>>> func
<function func at 0x000001F43B1968B8>
>>> func.__repr__()
'<function func at 0x000001F43B1968B8>'

так что теперь у меня в голове возникают 2 вопроса

  1. - это функция типа класса?
  2. если да, как я могу определить __repr__ в Функция

небольшое объяснение для обоих вопросов:

1: потому что если вы сделаете это: func., а затем ctrl + пробел в IDE, вы увидите все, что класс также если так, то я получаю вопрос, является ли функция не (простым) классом?

2: могу ли я сделать что-то вроде этого:

def foo():
    def __repr__():
        return "lol"
    foo.__repr__ = __repr__
    return "foo function"

это работает в IDLE, но это не меняет вывод __repr__ перед вызовом, так что возможно ли изменить __repr__ до вызова функции?

Ответы [ 2 ]

2 голосов
/ 20 января 2020

является ли функция типом класса? Да

print(type(foo))

производит

<class 'function'>

Возможно ли изменить __repr__ до вызова функции?

Да, например, используя декоратор:

from functools import wraps


def repr(msg):
    def dec(fn):
        @wraps(fn)
        def new_fn(*args, **kwargs):
            return fn(*args, **kwargs)

        new_fn.__repr__ = lambda: msg
        return new_fn
    return dec


@repr("LOL")
def foo():
    return "foo function"

print(foo)
print(foo.__repr__())
print(foo())

производит

<function foo at 0x7f556d959ef0>
LOL
foo function
0 голосов
/ 20 января 2020

отвечает:

отвечает на вопрос 2: нет, не использует def

отвечает на вопрос 1: да, вы можете видеть функцию как класс, потому что python основан на классах

вариант 1 (с использованием классов):

, потому что это:

class foo():
    def __init__(self):
        self = "foo"

и это:

class _foo():
    def __init__(self):
        self.foo = "foo"
    def __call__(self):
        return self.foo
foo = _foo()

для пользователя такие же, как:

def foo():
    return "foo"

, так что если вы действительно хотите иметь что-то похожее на функцию, но с пользовательской версией __repr__ вам просто нужно сделать что-то вроде этого :

class _foo():
    def __init__(self):
        self.foo = "foo"
    def __repr__(self):
        return "func(foo)"
    def __call__(self):
        return self.foo
foo = _foo()

, потому что теперь, если вы выполните foo в IDLE после вставки этого в него, вы увидите вывод:


>>> foo
func(foo)
>>> 

с использованием класса-оболочки:

в этом примере я использую класс в качестве оболочки:

class func_wrapper():

    def __init__(self,func,repr_msg):
        self.func = func
        self.repr_msg = repr_msg


        self = repr_msg

    def __call__(self,*args,**kwargs):
        return self.func(*args,**kwargs)
    def __repr__(self):
        return self.repr_msg




def repr(msg):
    def dec(fn):

        wrapper = func_wrapper(func = fn,repr_msg = msg)

        return wrapper
    return dec


@repr("LOL")
def foo():
    return "foo function"

print(foo)
print(foo.__repr__())
print(foo())

и это печатает:

LOL
LOL
foo function

, объясняя:

(почти ) все в python - это класс, попытайтесь использовать тип (объект), который вы увидите почти с каждым «объектом», который говорит, что это класс.

, поэтому я пытаюсь сказать, что python почти барельеф Вокруг классов они повсюду, потому что если вы пытаетесь найти не класс из чего-то, что не является встроенным. Потому что только некоторые встроенные функции не рассматриваются как классы

recap:

, так что Напомним мой ответ:

Нет, вы не можете использовать def, чтобы вызывать __repr__ до вызова функции, но вы можете создать класс, который действительно выглядит как функция, и там вы можете создать класс, который для пользователя это как функция

...