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

有必要在python3中区分方法和功能吗?,python,Python,Python中有很多方法和函数 这是一段代码 a = list('hello,world') len(a) 文件上说len()是一个 内置函数或方法 我知道方法和函数的区别,方法是在对象的上下文中,函数不是 问题是,是否有必要在博客中区分方法和功能 例如,我正在写一篇教程,我可以说 表达式_1:len(a)函数给出列表a中元素的数量 或 表达式_2:len(a)方法给出了列表a中元素的数量 有必要区分这些场景中的术语吗?作为术语,方法附加到类实例(或者类本身,对于classmethods和st

Python中有很多方法和函数

这是一段代码

a = list('hello,world')
len(a)
文件上说
len()
是一个

内置函数或方法

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

问题是,是否有必要在博客中区分方法和功能

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

表达式_1:len(a)函数给出列表a中元素的数量

表达式_2:len(a)方法给出了列表a中元素的数量


有必要区分这些场景中的术语吗?

作为术语,方法附加到类实例(或者类本身,对于
classmethod
s和
staticmethod
s),函数不是

实际上,在Python3中,这种区别比以前要弱得多。最初,在Python2中,“有条不紊”更为重要;在类中定义函数时,如果从类中引用,则该函数为未绑定方法;如果在实例中引用,则为绑定方法

在Python3中,未绑定方法的概念消失了;从类本身引用时,得到的是普通函数,而不是方法(绑定或未绑定);只有从类的实例引用绑定方法时,才能获得该方法

基本上,现在有两类事情:

  • 不能绑定为方法的函数(因为它们不实现描述符协议来生成绑定方法;仅适用于CPython中的内置函数)
  • 可以绑定为方法的函数(包括Python本身定义的所有函数)
  • 类别2中的所有内容都是一个函数,如果附加到一个类,然后从该类的实例引用,则该函数可以充当方法。术语描述了意图,但作为一个实现问题,剩下的差别很小


    请注意,即使在Python2中,两类方法也是相同的,只是函数的描述符协议在从类本身加载时也被调用(要绕过它并在不创建未绑定方法的情况下获取原始函数,您必须执行
    ClassName.\uu dict\uuu['methodname']
    )。因此,在实现过程中,方法始终是绑定函数的结果。

    回答有关记录代码的更新问题:是的,这种区别很重要。说
    len
    是函数是正确的,说它是方法是错误的


    下面是函数和方法之间的区别

    具体到Python,两者的实用性没有太大区别。函数和方法的用法之间有一些细微的差别。函数是自己定义的,而方法是在它们所属的类的定义中定义的。例如:

    def my_函数(my_自定义对象):
    “”“这是一个函数。请查看如何将其与任何对象分开定义。”
    它的工作原理是
    返回我的自定义对象。自定义方法()
    类别MyCustomClass:
    定义初始参数(self、某些参数、其他参数):
    self.first=某些参数
    self.second=其他参数
    def自定义_方法(自身):
    做事(自我第一)
    返回做其他事情(self.second)
    my_obj=MyCustomClass('foo','bar'))
    打印(我的对象自定义方法())
    打印(my_函数(my_obj))
    
    在方法的定义中,第一个参数通常是
    self
    。这是Python放置方法所属对象的位置;这样,该方法可以使用属于该对象的其他属性和方法。注意调用方法
    custom\u方法
    和调用函数
    my\u函数
    之间的区别。调用方法时,对象将作为第一个参数(
    self
    )隐式传递

    在Python中,您可以使用类的成员方法并将其应用于该类型(或任何其他类型)的对象,如下所示:

    MyCustomClass.custom\u方法(my\u obj)
    
    从语义上讲,当正在执行的进程以函数的进程所没有的方式“属于”对象时,通常使用方法。例如,
    dog.bark()。
    比如说

    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'>
    

    方法属于对象-函数不属于对象。是的,它属于对象。方法在类及其实例的上下文中运行,函数不在其中运行。@czlsws,只需使用
    type()
    来提供信息。
    def foo():
        pass
    
    type(foo)  # function