Python开发中function和method解析
这两个概念已经有很多人解释过了,从本文的『参考』中就可以看出来。之所以还要写一篇这个主题,主要是为了用自己的语言表述一下,并且尽可能的讲的清楚一点。
泛泛地说,function是一般意义上的函数,即对一段代码的封装,并由一个地址(函数名)来调用。
method通常是面向对象的概念,即method是属于一个类或类的对象的。method是与类或类的对象相关的函数。
下面讲一下我对这两个概念的更具体的理解。如有错误,敬请指正。
在C语言中『function』翻译为『函数』(C函数)。在Java中一般不使用『function』,而是改用『method』来称呼函数,『method』翻译为『方法』(Java方法)。
在Python中,你会同时看到『function』和『method』,所以Google的Python Style Guide中也对『function』和『method』分别进行了命名规则说明。
Type | Public | Internal | 解释 |
---|---|---|---|
Functions | lower_with_under() | _lower_with_under() | 如果允许外部模块调用,命名采用小写字母加下划线(不以下划线开头)。 如果不允许外部调用,则命名以下划线开头,表示私有。 |
Method Names | lower_with_under() | _lower_with_under() (protected) or __lower_with_under() (private) | 如果对外公开(外部可调用),则命名为小写字母加下划线,且不以下划线开头。 如果不对外公开,命名以一个下划线开头(protected)或者以以2个下划线开头(private)。注意:这里的protected和private与C++中的访问策略不一样。python中所谓的protected和private函数都是可以被调用的。更多内容,请见『参考』 |
Function/Method Parameters | lower_with_under | function或者method的参数,命名采用小写字母加下划线 |
在Python中,『function』就是一般意义上的函数,『method』是与类相关的函数,从概念上说,『function』和『method』都是函数,且『method』是『function』的子集。注意,这只是从概念上说,实际上,python中『function』和『method』是不同的类型,有class function和
class method之分(python3中)。
在Python中用
def定义的都是函数。在类内定义的函数,通常来说是method,但也可能是function。这要看如何使用这个函数。总结一下,我对python中『function』和『method』的理解,如下:
如果一个函数(
def定义的)是不用依赖类的实例就可以调用,那么这个函数就是function类型的。例如,类的静态方法(
@staticmethod),或者直接通过类名来调用类里声明的非静态函数,形式如
ClassX.funcA()。
如果一个函数(
def定义的)必须要依赖类的实例才能执行,那么此函数就是method类型的。例如,通过类的实例调用的方法,形式如
ClassX().funcA(). (与上面的区别是括号:
ClassX()
和
ClassX
的区别)
如果一个函数(
def定义的)依赖类本身,那么此函数是method类型的。这类函数是通过
@classmethod修饰的类方法,因为类方法的第一个参数必须是类本身。注意,类方法的第一个参数不是类的实例(对象)。
注意:以上结论是通过分析python3的代码得出的,与python2的会有些差异。
注意:除非有特别说明,以下代码的运行环境为Python3。
★ 1. function or mthod
★ 1. function or mthod
一个普通函数的例子:
>>> def func(): ... return 0 ... >>> type(func)
直接通过类名调用类内的非静态函数:
>>> class ClassB(object): ... def func(): ... return 'hello' ... >>> ClassB.func() 'hello'
在类内部声明了函数(funcB),如果通过类直接访问funcB,其类型为function。如果通过类实例访问funcB,则其类型为method。
>>> class ClassB(object): ... def funcB(self): ... return 1 ... >>> type(ClassB.funcB) >>> type(ClassB().funcB)
ClassB.funcB和
ClassB().funcB是不同的类型。所以调用的方式也是不同的。
>>> ClassB.funcB(None) #function类型,不用创建实例,直接调用 1 >>> ClassB.funcB(ClassB()) #function类型,实例在参数中传入 1 >>> ClassB().funcB() #method类型,创建实例,然后调用 1
如果通过ClassB的实例去调用
funcB()(
ClassB().funcB()),此时
funcB就是method类型。
如果通过ClassB类直接调用funcB()(
ClassB.funcB()),此时
funcB是function类型。
注意:在Python2.7.1中,与Python3不同。类里面声明的方法,就是实例方法。不是function类型。
在Python2.7.1中运行:
>>> class ClassC: ... def func(self): ... return 2 ... >>> ClassC.func >>> type(ClassC.func) # 注意,这里不是function类型 >>> type(ClassC().func)
★ 2. 『@classmethod』
★ 2. 『@classmethod』
声明一个classmethod:
>>> ClassE.funcE(1,2) 3 >>> ClassE().funcE(1,2) 3
classmethod修饰的函数的类型总是method类型:
>>> class ClassE(object): ... def __init__(self, str, arg1, arg2): ... self.str = str ... print(str) ... @classmethod ... def funcE(cls, arg1, arg2): ... obj = cls('hello world', arg1, arg2) ... return obj ...
创建ClassE的实例:
>>> obj = ClassE.funcE(1, 2) hello world # 调用了ClassE的初始化函数,返回的obj是ClassE的实例(对象) >>> obj.str 'hello world'
classmethod的官方说明:https://docs.python.org/3/library/functions.html
*上对classmethod的解释:https://*.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner
★ 3. 『@staticmethod』
★ 3. 『@staticmethod』
声明一个staticmethod的函数:
>>> class ClassD(object): ... @staticmethod ... def func(arg1, arg2): ... return arg1 + arg2 ...
该修饰符用在类内部的函数上。
静态方法,是不依赖类的实例的方法,其方法的第一个参数不是类的实例(对象)。
有两种调用方式:
直接通过类来调用 通过类的实例来调用(此时静态方法无视类的实例的存在)
调用
ClassD的静态方法
,如下:
>>> ClassD.func(1,2) # 通过类直接调用即可 3 >>> ClassD().func(1,2) # 通过实例来调用,func无视实例的存在,即会忽略实例 3
对于静态方法来说,其类型总是function。因为静态方法是不用依赖类的实例(对象)的。
>>> type(ClassD.funC) >>> type(ClassD().funC)
上一篇: 这货是要人道毁灭吗
下一篇: Python汉译英小程序代码实现