如何调用存储在变量中的方法?

时间:2018-01-23 18:13:37

标签: python class methods

如果我有一个方法Foo的类method1,有没有办法在实例化之前将此方法存储在变量中,然后我可以调用 之后这个类被实例化了吗?

例如:

class Foo:
    def method1(self, arg):
        print(self, arg)

# something like this variable, but which can be called with instantiated class 
func = Foo.method1

foo = Foo()
foo.func(1)  # I want to call it in a similar way to this

2 个答案:

答案 0 :(得分:1)

在python中,函数和方法之间没有真正的区别 - 方法只是类中定义的函数。

对我们来说,这意味着存储在变量func中的函数可以像任何其他函数一样被调用。如果func引用Foo.method1,则它是包含2个参数的函数:selfarg。为了调用func,我们只需将Foo实例作为self参数传递,将另一个值作为arg参数传递:

func(foo, 1)

我们通常不必为self传递参数的原因是因为通过实例访问该方法会自动将函数 method1转换为绑定方法,隐式传递self参数:

>>> Foo.method1  # Foo.method1 is a function
<function Foo.method1 at 0x7f9b3c7cf0d0>
>>>
>>> foo.method1  # but foo.method1 is a bound method!
<bound method Foo.method1 of <__main__.Foo object at 0x7f9b3c7dd9e8>>

有关功能和方法的更多详细信息,请参阅this question

答案 1 :(得分:0)

除了Rawing's出色的答案外,如果你所访问的只是一个静态或类属性,你可能不需要实例化该类:

var jaxbElement = new JAXBElement(qName, pspApp.getClass(), pspApp);

因此,您可以先将变量名称class Container: class_var = "class_var" def __init__(self, inst_var): self.inst_var = inst_var print("Instantiated") @staticmethod def static_mtd(static_arg): print(static_arg) def instance_mtd(self): print(self.inst_var) @classmethod def class_mtd(cls): print(cls.class_var) stat = Container.static_mtd stat("static_arg") # static_arg inst = Container.instance_mtd inst(Container("inst_var")) # Instantiated, inst_var inst2 = Container("inst_var2").instance_mtd # Instantiated inst2() # inst_var2 clas = Container.class_mtd clas() # class_var var = Container.class_var # class_var 分配给实例方法inst,稍后再实例化Container.instance_mtd,然后将实例化的class反馈回{{ 1}}作为class参数。这当然相当繁琐,这意味着您重新分配的实例方法在类之外被有效地定义。