有必要区分python3中的方法和功能吗?

时间:2019-05-23 02:01:12

标签: python

Python中有很多方法和功能。

这是一段代码

a = list('hello,world')
len(a)

医生说len()

  

builtin_function_or_method

我知道方法和函数之间的区别,方法是在对象的上下文中,函数不是。

问题是,有必要区分博客中的方法和功能吗?

例如,我正在写教程,我可以说

expression_1:len(a)函数给出列表a中的元素数

expression_2:len(a)方法给出列表a中的元素数

在这种情况下是否有必要区分术语?

3 个答案:

答案 0 :(得分:4)

就术语而言,方法是附加到类实例(或classmethodstaticmethod的类本身)上的,而函数不是。

在实践中,在Python 3中,这种区别比以前弱得多。最初,在Python 2中,“方法”更为重要。如果在类中定义一个函数,则从该类中引用该函数将成为一个未绑定的方法,如果在实例上对其进行引用,将使其成为一个绑定的方法。

在Python 3中,无界方法的概念消失了。当从类本身引用时,您将获得一个普通函数,而不是一个方法(绑定或未绑定);当您从类的实例中引用该方法时,您只会得到一个绑定方法。

基本上,现在实际上有两类东西:

  1. 不能绑定为方法的函数(因为它们没有实现描述符协议来生成绑定方法;仅适用于CPython中的内置函数)
  2. 可以绑定为方法的函数(包括Python本身定义的所有函数)

类别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