一、前言:
python中,类中的方法有两类,绑定方法和非绑定方法,今天就来研究一下。
参考博文:https://blog.csdn.net/u013486414/article/details/84950621
二、绑定方法
1、绑定方法的定义
绑定给谁,就由谁来调用,谁来调用就把它当作一个参数自动传入。
2、对象的绑定方法
在学习和工作中,我们最常用的就是对象的绑定方法,在python中,凡是类中的方法或函数,默认情况下都是绑定给对象使用的。
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def tall_info(self):
pass
obj = People('金鞍少年', 18)
print(obj.tall_info)
# 输出结果:
<bound method People.talk of <__main__.People object at 0x00000229F0BD5550>>
从上面可知,类中的tall_info方法,是绑定给对象使用的。下面,我在看看另外一种情况。
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def tall_info(self):
print('1223')
obj = People('金鞍少年', 18)
print(People.tall_info)
print(obj.tall_info)
输出结果:
<function People.tall_info at 0x0000021F7AF3C160> 用类来调用是当作普通函数使用
<bound method People.tall_info of <__main__.People object at 0x0000021F7AE85550>> 而对象来调用则为绑定方法
三、类的绑定方法
既然python默认类中的方法或函数,都是绑定给对象使用的。那么类中的绑定方法怎么解除和对象的绑定绑定关系,进而绑定到类呢?这个时候需要用到:@classmethod方法
class People:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def tall_info(cls): # cls 和 self都是一种命名习惯习惯, cls作为第一个参数来表示类本身. 在类方法中用到.
return cls('金鞍少年', 18) # 实际是: People('金鞍少年', 18)
obj = People.tall_info()
print(obj.name, obj.age) # 金鞍少年 18
print(People.tall_info)
print(obj.tall_info)
# <bound method People.tall_info of <class '__main__.People'>>
# <bound method People.tall_info of <class '__main__.People'>>
根据上述结果所知:
1、和对象绑定方法一样:绑定给类,就由类来调用,并将类当作第一个参数传入。
2、和对象绑定方法不同:当对象在调用类的绑定方法时,也会默认把类当作参数传递进去。
PS:cls 和 self都是一种命名习惯习惯, cls作为第一个参数来表示类本身. 在类方法中用到
四、非绑定方法
在类中有很多普通的方法,本身不需要绑定给对象或者类来使用,谁都可以调用,没有自动传值效果,这就是非绑定方法。在python类中会默认给方法(函数)一个实例,用于绑定给对象;如何解除这个绑定关系,需要用到,@staticmethod方法
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(): # 去掉了self,会报错
print('我只是一个输出信息,不需要绑定对象和类来使用,也不需要参数传进来')
obj = People('金鞍少年',18)
People.print_info()
obj.print_info()
结果:报错
TypeError: print_info() takes 0 positional arguments but 1 was given
也就是print_info ,这个方法本身是不需要绑定对象和类来使用,但去掉了类中默认给的实例,就会报错!
class People:
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def print_info():
print('我只是一个输出信息,用不到参数,即不需要参数传进来')
obj = People('金鞍少年',18)
People.print_info() #我只是一个输出信息,用不到参数,即不需要参数传进来
obj.print_info() # 我只是一个输出信息,用不到参数,即不需要参数传进来
print(People.print_info)
print(obj.print_info)
# <function People.print_info at 0x000001977616C160>
# <function People.print_info at 0x000001977616C160>
结果:使用 @staticmethod 方法,即可正常使用函数,并将原本默认绑定给对象使用的方法,变为一个普通函数。既然是函数,也就可以遵循函数的使用要求,需要几个函数,就传入几个函数。
class People:
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def print_info(x,y):
# print('我只是一个输出信息,用不到参数,即不需要参数传进来')
print('我是传入的参数:%s--%s'% (x, y))
obj = People('金鞍少年',18)
People.print_info(1,2)
obj.print_info(1,2)
结果:
我是传入的参数:1--2
我是传入的参数:1--2