Как выполнить функцию, если передан экземпляр класса?
У меня сейчас есть 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)