Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,如何;自动地;从实例方法调用函数/方法?_Python_Class_Metaclass - Fatal编程技术网

Python,如何;自动地;从实例方法调用函数/方法?

Python,如何;自动地;从实例方法调用函数/方法?,python,class,metaclass,Python,Class,Metaclass,有没有办法强制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(

有没有办法强制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”,我宁愿让它们在同一个地方调用initialize一次,而不是每次手动调用该方法。这是元类可以做的吗?

您可以在Python中使用装饰器。在调用函数之前,让装饰器调用所需的函数。您将能够在所有所需的功能中使用decorator。这是语法糖。

您可以创建一个包装函数:

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()!")
尝试:

编辑: 然而,实践是使用DevShark建议的
装饰器

另一篇文章对此进行了讨论,请参阅


你想解决什么问题?初始化是否昂贵?为什么不在初始化器
\uuuu init\uuuu
中执行此操作?您对为什么不想在
myfunc()
中简单调用
initialize()
的解释对我来说毫无意义。我正在侦听消息队列(兔子)上的事件。不同的事件触发不同的回调,这些回调对应于类上的方法。初始化并不昂贵,但每次调用回调时它都需要是唯一的。例如,我有一个唯一的“log_tag”值,该值对于任何回调调用都必须是唯一的。我可以在myfuncN()的每一个变体中调用initialize(),它看起来不是很枯燥。啊,甚至没有想过使用装饰器。我想那会满足我的要求。。。我将尝试一下。请举例说明如何使用
functools.wrap
实现这一点,我想知道是否可以避免。如果我有10个或100个“myfuncN()”方法,那么我将在每个方法中调用initialize()。根据上面的帖子,我认为装饰师是我想要的。
>>> a = MyClass()
>>> a.myfunc()
I'm doing some initialization
This is myfunc()!