如果传递了 class 个实例,如何执行函数?
How to execute function if class instance is passed?
我目前有一个 TestClass
可以调用。如果任何属性等于 None
,可调用函数将引发异常。将其定义为可调用的目的是当 TestClass
实例被传递给另一个函数或被复制时,它会在传递之前检查所有属性是否存在,否则会引发异常。
下面显示此逻辑的行是 UsesTestClass(testClass())
。
理想情况下,我希望能够执行相同的检查而不必 "call" class 实例。例如,UsesTestClass(testClass)
。是否有神奇的方法或其他方法来配置 class 以便能够在作为参数传递之前执行函数?
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())
如果您使用集成到 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)
我目前有一个 TestClass
可以调用。如果任何属性等于 None
,可调用函数将引发异常。将其定义为可调用的目的是当 TestClass
实例被传递给另一个函数或被复制时,它会在传递之前检查所有属性是否存在,否则会引发异常。
下面显示此逻辑的行是 UsesTestClass(testClass())
。
理想情况下,我希望能够执行相同的检查而不必 "call" class 实例。例如,UsesTestClass(testClass)
。是否有神奇的方法或其他方法来配置 class 以便能够在作为参数传递之前执行函数?
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())
如果您使用集成到 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)