python基础:类的绑定方法与非绑定方法(详解)

一、前言:

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:clsself都是一种命名习惯习惯, 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
发布了47 篇原创文章 · 获赞 41 · 访问量 4892

猜你喜欢

转载自blog.csdn.net/weixin_42444693/article/details/104714694