有必要在python3中区分方法和功能吗?
Python中有很多方法和函数 这是一段代码有必要在python3中区分方法和功能吗?,python,Python,Python中有很多方法和函数 这是一段代码 a = list('hello,world') len(a) 文件上说len()是一个 内置函数或方法 我知道方法和函数的区别,方法是在对象的上下文中,函数不是 问题是,是否有必要在博客中区分方法和功能 例如,我正在写一篇教程,我可以说 表达式_1:len(a)函数给出列表a中元素的数量 或 表达式_2:len(a)方法给出了列表a中元素的数量 有必要区分这些场景中的术语吗?作为术语,方法附加到类实例(或者类本身,对于classmethods和st
a = list('hello,world')
len(a)
文件上说len()
是一个
内置函数或方法
我知道方法和函数的区别,方法是在对象的上下文中,函数不是
问题是,是否有必要在博客中区分方法和功能
例如,我正在写一篇教程,我可以说
表达式_1:len(a)函数给出列表a中元素的数量
或
表达式_2:len(a)方法给出了列表a中元素的数量
有必要区分这些场景中的术语吗?作为术语,方法附加到类实例(或者类本身,对于
classmethod
s和staticmethod
s),函数不是
实际上,在Python3中,这种区别比以前要弱得多。最初,在Python2中,“有条不紊”更为重要;在类中定义函数时,如果从类中引用,则该函数为未绑定方法;如果在实例中引用,则为绑定方法
在Python3中,未绑定方法的概念消失了;从类本身引用时,得到的是普通函数,而不是方法(绑定或未绑定);只有从类的实例引用绑定方法时,才能获得该方法
基本上,现在有两类事情:
请注意,即使在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