def ismethod(object):
"""Return true if the object is an instance method.
Instance method objects provide these attributes:
__doc__ documentation string
__name__ name with which this method was defined
im_class class object in which this method belongs
im_func function object containing implementation of method
im_self instance to which this method is bound, or None"""
return isinstance(object, types.MethodType)
使用源代码
第一个参数是
self
,这只是惯例。通过从类的dict按名称访问方法,您将绕过绑定,因此它看起来是一个函数而不是一个方法如果要按名称访问方法,请使用
^{pr2}$那么,你的意思是}是一个函数吗?在
obj.mymethod
是一个方法(隐式传递了self
),而{基本上,
Klass.__dict__['mymethod']
是“raw”函数,它可以由一个叫做描述符的东西转换成一个方法。这意味着类上的每个函数都可以是普通函数和方法,这取决于您如何访问它们。这就是类系统在Python中的工作方式,非常正常。在如果您想要方法,就不能通过
__dict__
(无论如何,您永远不应该这样做)。要获得所有方法,您应该执行inspect.getmembers(Klass_or_Instance, inspect.ismethod)
您可以阅读details here,关于这一点的解释在“用户定义方法”下。在
您将看到Python幕后机制的一些效果。在
当您编写
f = MyClass.__dict__['mymethodname']
时,您将得到“mymethodname”的原始实现,这是一个普通函数。要调用它,需要传入一个附加参数class instance。在当您编写
f = MyClass.mymethodname
(注意mymethodname后面没有括号),您将得到一个类MyClass的未绑定方法,它是MethodType
的一个实例,它包装了上面获得的原始函数。要调用它,需要传入一个附加参数class instance。在当您编写
f = MyClass().mymethodname
(请注意,在使用MyClass的方法之前,我已经创建了一个类MyClass的对象),您将得到一个类MyClass实例的绑定方法。您不需要向它传递额外的类实例,因为它已经存储在其中。在{{a1>用一个名为^的非绑定}方法来命名。例如:
或者
^{pr2}$相关问题 更多 >
编程相关推荐