如果我有一个方法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
答案 0 :(得分:1)
在python中,函数和方法之间没有真正的区别 - 方法只是类中定义的函数。
对我们来说,这意味着存储在变量func
中的函数可以像任何其他函数一样被调用。如果func
引用Foo.method1
,则它是包含2个参数的函数:self
和arg
。为了调用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
参数。这当然相当繁琐,这意味着您重新分配的实例方法在类之外被有效地定义。