绑定方法和非绑定方法
-
我们想让类和对象都能用某一个方法
【一】绑定方法
(1)绑定给对象的方法
-
就是:对象可以任意调用的方法
-
对象可以直接调用
obj.talk()
-
类调用需要传入生成的对象
clss.talk(obj)
-
# 对象可以任意调用的方法
class Student(object):
def __init__(self, name):
self.name = name
def talk(self):
print(f'{self.name} is talking')
# (1)对象可以直接调用绑定给对象的方法
s = Student('dream')
#执行对象的方法
s.talk() # 默认将 s 作为 self 自动传入
# (2)类调用绑定给对象的方法,需要主动传入一个生成的对象
Student.talk(s)
(2)绑定给类的方法
-
绑定给类的方法就要用
@classmethod
装饰器
#
对象和类都可以任意调用的方法
class Student(object):
def __init__(self, name):
self.name = name
# 【1】绑定给对象的方法
# 对象可以直接调用 obj.talk()
# 类调用需要传入生成的对象 clss.talk(obj)
def talk(self):
print(self) # <__main__.Student object at 0x0000017EE9CDC640>
print(f'{self.name} is talking')
# 【2】绑定给类的方法
@classmethod
def read(cls, *args, **kwargs):
'''
:return: 调用当前方法的类
'''
# print(cls) # <class '__main__.Student'>
obj = cls(*args, **kwargs) # Student(*args,**kwargs)
print(f'{obj.name} is reading')
stu = Student('dream')
# print(Student) # <class '__main__.Student'>
# (1)对象调用绑定给类的方法, 默认将实例化得到当前对象的类自动传入
stu.read('dream')#dream is reading
# (2)类调用绑定给类的方法,类可以直接调用,默认将调用当前方法的类自动传入
Student.read('dream')#dream is reading
(3)非绑定方法
-
关键装饰器
@staticmethod
-
对象调用非绑定方法,直接调用
-
Student.write()
-
-
类调用非绑定方法,直接调用
-
Student.write()
-
-
-
不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。
-
就是一个普通工具而已
class Student(object):
def __init__(self, name):
self.name = name
...
@staticmethod
#不能自动传值
def write():
print(f"00")
student = Student("tom")
print(Student)#<class '__main__.Student'>
# (1)对象调用非绑定方法, 不用传任何参数,和普通函数一样
student.write()
# (2)类调用非绑定方法, 不用传任何参数,和普通函数一样
Student.write()
【二】两个绑定方法的总结
(1)绑定方法
【1】绑定给对象的方法
-
我们正常在函数内部定义的方法
-
特征就是自动补全self
-
对象调用直接调用(默认将当前的对象作为self默认参数传入)
-
实例化得到的对象.函数名()
-
-
类调用需要传递额外的参数,额外的参数就是实例化得到的对象
-
类名.函数名(实例化得到的对象)
-
【2】绑定给类的方法
-
需要在类内部用
@classmethod
装饰的函数 -
特征就是自动补全
cls
并且有@classmethod
装饰 -
对象调用直接调用(默认将当前的对象的类作为
cls
默认参数传入)-
实例化得到的对象.函数名()
-
-
类调用直接调用,默认将当前类作为
cls
自动传入-
类名.函数名()
-
(2)非绑定方法
-
需要在类内部用
@staticmethod
装饰的函数 -
特征不会自动补全任何参数
-
对象调用直接调用
-
类调用直接调用
-
类调用直接调用
-
-
就像一个普通函数
-
类名.函数名()
-