Python,如何 "automatically" 从实例方法中调用 function/method?
Python, How to "automatically" call a function/method from an instance method?
有没有办法强制Python中的实例方法在执行之前调用另一个方法?
一个简单的演示示例:
class MyClass(object):
def __init__(self):
pass
def initialize(self):
print "I'm doing some initialization"
def myfunc(self):
print "This is myfunc()!"
我想要一些方法让 myfunc() 在 运行 之前自动调用 initialize()。如果我这样做:
obj = MyClass()
obj.myfunc()
我希望看到以下输出:
I'm doing some initialization
This is myfunc()!
无需在 myfunc() 中显式调用 initialize()。
原因是如果我有很多 "myfunc" 的实例,比如 myfunc1、myfunc2、myfunc3,它们都需要调用 "initialize",我宁愿让它们都调用一次初始化在同一个地方,而不是每次手动调用该方法。这是 meta 类 可以做的吗?
您可以在 Python 中使用装饰器。让装饰器在被调用的函数之前调用你想要的函数。您将能够在所有需要的功能中使用装饰器。这是语法糖。
你可以做一个包装函数:
def wrapper(self, func_name):
self.initialize()
self.func_name()
def myfunc1(self):
# do something
def myfunc2(self):
# do something
obj.wrapper(myfunc1)
obj.wrapper(myfunc2)
将 self.initialize()
添加到 myfunc()
,这应该可以满足您的需求。
class MyClass(object):
def __init__(self):
pass
def initialize(self):
print("I'm doing some initialization")
def myfunc(self):
self.initialize()
print("This is myfunc()!")
尝试:
>>> a = MyClass()
>>> a.myfunc()
I'm doing some initialization
This is myfunc()!
编辑:
但是,实践是按照 DevShark 的建议使用 decorators
。
It's discussed in another post, see Python decorators in classes
有没有办法强制Python中的实例方法在执行之前调用另一个方法?
一个简单的演示示例:
class MyClass(object):
def __init__(self):
pass
def initialize(self):
print "I'm doing some initialization"
def myfunc(self):
print "This is myfunc()!"
我想要一些方法让 myfunc() 在 运行 之前自动调用 initialize()。如果我这样做:
obj = MyClass()
obj.myfunc()
我希望看到以下输出:
I'm doing some initialization
This is myfunc()!
无需在 myfunc() 中显式调用 initialize()。
原因是如果我有很多 "myfunc" 的实例,比如 myfunc1、myfunc2、myfunc3,它们都需要调用 "initialize",我宁愿让它们都调用一次初始化在同一个地方,而不是每次手动调用该方法。这是 meta 类 可以做的吗?
您可以在 Python 中使用装饰器。让装饰器在被调用的函数之前调用你想要的函数。您将能够在所有需要的功能中使用装饰器。这是语法糖。
你可以做一个包装函数:
def wrapper(self, func_name):
self.initialize()
self.func_name()
def myfunc1(self):
# do something
def myfunc2(self):
# do something
obj.wrapper(myfunc1)
obj.wrapper(myfunc2)
将 self.initialize()
添加到 myfunc()
,这应该可以满足您的需求。
class MyClass(object):
def __init__(self):
pass
def initialize(self):
print("I'm doing some initialization")
def myfunc(self):
self.initialize()
print("This is myfunc()!")
尝试:
>>> a = MyClass()
>>> a.myfunc()
I'm doing some initialization
This is myfunc()!
编辑:
但是,实践是按照 DevShark 的建议使用 decorators
。
It's discussed in another post, see Python decorators in classes