Как выполнить функцию, если передан экземпляр класса? - PullRequest
0 голосов
/ 02 марта 2019

В настоящее время у меня есть 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 Ответ

0 голосов
/ 02 марта 2019

Если вы используете библиотеку типов, интегрированную в 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)
...