网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受

 与类和实例无绑定关系的function都属于函数(function);
与类和实例有绑定关系的function都属于方法(method)。

“与类和实例无绑定关系”就道出了其中的关键

我们知道python是动态的编程语言,python的类除了可以预先定义好外,还可以在执行过程中,动态地将函数绑定到类上,绑定成功后,那些函数就变成类的方法了。

定义User类

可以使用__slots__来限制绑定的属性和方法

 user.py

 class User():

     def __init__(self,name,age):
self.name=name
self.age=age #__slots__ = ('name','age','printNameAndAge','printName')#该行启用后,会限制User类可以使用的属性和方法

使用types.MethodType动态绑定

 from classtest.user import User
import types # 将函数printNameAndAge作为方法,添加到user实例上
user=User("test",28)
def printNameAndAge(self):
print(self.name,self.age)
user.printNameAndAge=types.MethodType(printNameAndAge,user)
user.printNameAndAge()#test 28 # 将函数printName作为方法,添加到User类上,新生成的实例都可以使用(不推荐使用这种方法,因为有时候没办法确定,类添加方法和类实例化的先后顺序)
def printName(self):
print(self.name)
User.printName=printName
user.printName()#test user2=User("test2",29)
user2.printName()#test2 def printAge(self):
print(self.age)
user.printAge=printAge#AttributeError: 'User' object has no attribute 'printAge' # #下面的函数中没有添加self,可以不需要使用types.MethodType(),但是没有办法访问实例中的内容。从某种意义上来说,printNAndA依然是函数,因为没有使用self绑定。
# user3=User("test3",30)
# def printNAndA(name,age):#这里定义时就和上面的不一样
# print(name,age)
# #将函数printNameAndAge作为方法,添加到user实例上
# user3.printNAndA=printNAndA
# user3.printNAndA("test4",31)#test4 31 #因为没有绑定self,所以("test3",30)的内容是无法通过printNAndA()访问的
# user3.addr="上海"
# print(user3.addr)#上海
#
# def printN(name):
# print(name)
# #将函数printName作为方法,添加到User类上
# User.printN=printN
# User.printN("test3")#test3

p.s.

Java中只有方法没有函数

参考:

https://blog.csdn.net/amoscn/article/details/77074403

https://www.cnblogs.com/semon-code/p/8257826.html

python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)的更多相关文章

  1. Python中函数的参数传递与可变长参数

    转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...

  2. python中函数的定义和详细的使用方法

    1. 函数的概念,函数是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集   2. 函数的作用,使用函数可以加强代码的复用性,提高程序编写的效率   3. 函数的使用,函数必须先创建才 ...

  3. python中函数参数传递的几种方法

    转自  http://www.douban.com/note/13413855/ Python中函数参数的传递是通过“赋值”来传递的.但这条规则只回答了函数参数传递的“战略问题”,并没有回答“战术问题 ...

  4. Python中__repr__和__str__区别

    Python中__repr__和__str__区别 看下面的例子就明白了 class Test(object): def __init__(self, value='hello, world!'): ...

  5. Python中函数参数传递问题【转】

    1. Python passes everything the same way, but calling it "by value" or "by reference& ...

  6. python 中函数的参数

    一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

  7. Python中classmethod与staticmethod区别

    classmethod:类方法staticmethod:静态方法 在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表示 ...

  8. python 中函数参数传递形式

    python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...

  9. 学以致用三十二-----python中函数的括号使用

    一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大看困惑. 今天来总结下. class aaa(): y = 'you' def __init__( ...

随机推荐

  1. 官网下载eclipse

    百度搜索eclipse,点击官网链接进入官网 进入官网点击Download Packages 根据自己需要选择对应的版本 选择对应的版本进入下图下载页面,然后点击下载即可 下载完成,解压zip包即可使 ...

  2. Python pylint的安装和使用

    Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之 ...

  3. Touching segments(数据结构)

    题目链接 Problem Statement Your Maths professor is a very nice guy, but he sometimes comes up with not s ...

  4. jeecms v9导入myeclipse 2015 ehcache.xml报错问题

    1.找不到ehcache.xml文件问题 cache-context.xml <property name="configLocation"> <value> ...

  5. 《DSP using MATLAB》Problem 7.33

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  6. ArrayList基础知识

    ArrayList简介 ArrayList 的底层是数组队列,相当于动态数组.与 Java 中的数组相比,它的容量能动态增长.在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ...

  7. dom4j和document

    DOM的优点和缺点: 优点:DOM操作思维清晰,简单 缺点:在操作大量数据的时候性能,不能保证 DOM(Document Object Model) // 表示出需要被操作的XML文件的路径,注意是文 ...

  8. Entity Framework底层操作封装V2版本号(5)

    这个框架到如今最大的变化立即就要出现了,哪就是对缓存的使用.由于系统常常要去读取数据库数据.可是大家知道.数据库的处理能力是有限的,所以对于一些数据量不大,可是又 须要常常去读取的功能来说.更好的方法 ...

  9. jQuery同步/异步调用后台方法

    $.ajax({ type: "Post", url: "UserManage.aspx/SubmitPage",//页面/方法名 data: "{' ...

  10. JMETER的三个线程组

    JMETER的三个线程组 Jmeter有三个线程组分类:Thread Group(线程组).setUp Thread Group.tearDown Thread Group,如下图所示: (1).th ...