zoukankan      html  css  js  c++  java
  • python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

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

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

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

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

    定义User类

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

    1 user.py
    2 
    3 class User():
    4 
    5     def __init__(self,name,age):
    6         self.name=name
    7         self.age=age
    8 
    9     #__slots__ = ('name','age','printNameAndAge','printName')#该行启用后,会限制User类可以使用的属性和方法

    使用types.MethodType动态绑定

     1 from classtest.user import User
     2 import types
     3 
     4 # 将函数printNameAndAge作为方法,添加到user实例上
     5 user=User("test",28)
     6 def printNameAndAge(self):
     7     print(self.name,self.age)
     8 user.printNameAndAge=types.MethodType(printNameAndAge,user)
     9 user.printNameAndAge()#test 28
    10 
    11 
    12 # 将函数printName作为方法,添加到User类上,新生成的实例都可以使用(不推荐使用这种方法,因为有时候没办法确定,类添加方法和类实例化的先后顺序)
    13 def printName(self):
    14      print(self.name)
    15 User.printName=printName
    16 user.printName()#test
    17 
    18 user2=User("test2",29)
    19 user2.printName()#test2
    20 
    21 def printAge(self):
    22     print(self.age)
    23 user.printAge=printAge#AttributeError: 'User' object has no attribute 'printAge'
    24 
    25 
    26 # #下面的函数中没有添加self,可以不需要使用types.MethodType(),但是没有办法访问实例中的内容。从某种意义上来说,printNAndA依然是函数,因为没有使用self绑定。
    27 # user3=User("test3",30)
    28 # def printNAndA(name,age):#这里定义时就和上面的不一样
    29 #     print(name,age)
    30 # #将函数printNameAndAge作为方法,添加到user实例上
    31 # user3.printNAndA=printNAndA
    32 # user3.printNAndA("test4",31)#test4 31 #因为没有绑定self,所以("test3",30)的内容是无法通过printNAndA()访问的
    33 # user3.addr="上海"
    34 # print(user3.addr)#上海
    35 # 
    36 # def printN(name):
    37 #     print(name)
    38 # #将函数printName作为方法,添加到User类上
    39 # User.printN=printN
    40 # User.printN("test3")#test3

    p.s.

    Java中只有方法没有函数

    参考:

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

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

  • 相关阅读:
    springboot 基础
    spring 基础
    spring MVC 基础
    windows shell
    oracle 创建用户和视图并授权
    maven 安装本地依赖
    JAVA ssl 证书
    mybatis 递归
    MyBatis基础
    当年的毕设-cpf (一个简易的协议 fuzzer)
  • 原文地址:https://www.cnblogs.com/moonpool/p/11333541.html
Copyright © 2011-2022 走看看