Как выполнить функцию, если передан экземпляр класса?

У меня сейчас есть TestClass это называется. Вызываемый выполняет функцию, которая вызывает исключение, если какой-либо атрибут равен None, Цель определения его как вызываемого такова, когда TestClass Экземпляр передается в другую функцию или копируется, он выполнит проверку того, что все атрибуты существуют до передачи, иначе он вызовет исключение.

Строка ниже, которая демонстрирует эту логику UsesTestClass(testClass()),

В идеале я хочу иметь возможность выполнять ту же проверку без необходимости "вызывать" экземпляр класса. Например, UsesTestClass(testClass), Есть ли волшебный метод или какой-то другой способ настроить класс так, чтобы он мог выполнять функцию перед передачей в качестве аргумента?

class TestClass:
    def __init__(self):
        self.name = None

    def run(self):
        if self.name is None:
            raise Exception("'name' attribute is 'None'")

    def __call__(self):
        self.run()
        return self

def UsesTestClass(testClass):
    print(testClass.name)

testClass = TestClass()
testClass.name = "Hello"
UsesTestClass(testClass())

1 ответ

Решение

Если вы используете библиотеку типов, интегрированную в python, вы можете сделать это.

import types


class TestClass:
    def __init__(self):
        self.name = None

    def __getattribute__(self, attr):
        method = object.__getattribute__(self, attr)
        if not method:
            raise Exception("Attribute %s not implemented" % attr)
        if type(method) == types.MethodType:
            self.run()
        return method

    def run(self):
        if self.name is None:
            raise Exception("'name' attribute is 'None'")

    def __call__(self):
        self.run()
        return self


def UsesTestClass(testClass):
    print(testClass.name)


testClass = TestClass()
testClass.name = "Hello"
UsesTestClass(testClass)
Другие вопросы по тегам