Python中有很多方法和功能。
这是一段代码
a = list('hello,world')
len(a)
医生说len()
是
builtin_function_or_method
我知道方法和函数之间的区别,方法是在对象的上下文中,函数不是。
问题是,有必要区分博客中的方法和功能吗?
例如,我正在写教程,我可以说
expression_1:len(a)函数给出列表a中的元素数
或
expression_2:len(a)方法给出列表a中的元素数
在这种情况下是否有必要区分术语?
答案 0 :(得分:4)
就术语而言,方法是附加到类实例(或classmethod
和staticmethod
的类本身)上的,而函数不是。
在实践中,在Python 3中,这种区别比以前弱得多。最初,在Python 2中,“方法”更为重要。如果在类中定义一个函数,则从该类中引用该函数将成为一个未绑定的方法,如果在实例上对其进行引用,将使其成为一个绑定的方法。
在Python 3中,无界方法的概念消失了。当从类本身引用时,您将获得一个普通函数,而不是一个方法(绑定或未绑定);当您从类的实例中引用该方法时,您只会得到一个绑定方法。
基本上,现在实际上有两类东西:
类别2中的所有内容都是一个函数,如果将其附加到一个类上,则可以从该类的实例中引用该方法。命名法描述了意图,但是作为实现的问题,几乎没有什么区别。
请注意,即使在Python 2中,这两种方法也是相同的,只是即使从类本身加载时,函数的描述符协议也会被调用(绕过它并获取原始函数而不创建未绑定的方法,您必须执行ClassName.__dict__['methodname']
)。因此,通常情况下,方法只是作为实现问题而绑定函数的结果。
答案 1 :(得分:0)
要回答有关文档代码的更新问题:是的,这种区别很重要。正确地说len
是一个函数,而错误地说它是一个方法。
这里是a quick StackOverflow explanation函数和方法之间的区别。
特定于Python,两者之间的用途没有太大区别。函数和方法的使用之间有一些细微的差异。函数是由它们自己定义的,而方法是在它们所属的类的定义内定义的。例如:
def my_function(my_custom_object):
"""This is a function. See how it's defined separately from any of the objects
it operates on."""
return my_custom_object.custom_method()
class MyCustomClass:
def __init__(self, some_param, other_param):
self.first = some_param
self.second = other_param
def custom_method(self):
do_stuff(self.first)
return do_other_things(self.second)
my_obj = MyCustomClass('foo', 'bar')
print(my_obj.custom_method())
print(my_function(my_obj))
在方法的定义中,第一个参数通常为self
。这是Python放置该方法所属的对象的位置。这样,该方法可以使用属于该对象的其他属性和方法。请注意,调用方法custom_method
与调用函数my_function
的区别。调用方法时,该对象将作为第一个参数(self
)隐式传递。
在Python中,您可以使用该类的member方法,并将其应用于该类型(或与此相关的任何其他类型)的对象,如下所示:
MyCustomClass.custom_method(my_obj)
通常,当执行的过程以某种函数的过程不属于对象的方式“属于”对象时,通常使用方法。例如,dog.bark()
可能比bark(dog)
更好。
答案 2 :(得分:0)
Python内置type()
可为您提供良好的调试信息。
例如。
dataset = FileField(validators=[FileRequired(), FileAllowed(['csv'],'Alleen CSV bestanden')])
data_name = StringField(_l('Naam van de dataset'), validators=[DataRequired()])
submit = SubmitField(_l('Upload bestand'))
输出的最后三行:
class C:
def __init__(self, name, age):
self.name = name
self.age = age
def m1(self, x):
print("Excellent {}".format(x))
@classmethod
def m2(cls, x):
print("Excellent cls {}".format(x))
@staticmethod
def m3(x):
print("Excellent static {}".format(x))
ci=C("John", 36)
L=dir(C) # c is a class
for i in L:
print("C::", i, type(eval('ci.'+i)))
显示方法和函数之间的区别。如果某物在本质上是静态的,例如...
C:: m1 <class 'method'>
C:: m2 <class 'method'>
C:: m3 <class 'function'>
,则它是一个函数,否则它是一个方法。
当某种功能起作用时,您会清楚地知道。
m3