Python进阶之绑定方法和非绑定方法

【一】绑定方法和非绑定方法介绍

【1】绑定方法

  • 绑定给谁,谁来调用就自动将它本身当作第一个参数传入

(1)绑定到类的方法

  • 用classmethod装饰器装饰的方法
  • 为类量身定制
  • 类.boud_method(),自动将类当作第一个参数传入
  • 其实对象也可调用,但仍将类当作第一个参数传入

(2)绑定到对象的方法

  • 没有被任何装饰器装饰的方法
  • 为对象量身定制
  • 对象.boud_method(),自动将对象当作第一个参数传入
  • 属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说

【2】非绑定方法

  • 用staticmethod装饰器装饰的方法
  • 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说

【3】小结

  • 与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值
  • 而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说

【二】绑定方法

【1】绑定给对象的方法

  • 对象可以任意调用的方法
class Student(object):
    school = '北京大学'

    def __init__(self, name):
        self.name = name

    def read(self):
        print(f"学生{self.name}的学校是{self.school}")


# (1)对象可以直接调用绑定给对象的方法
student = Student('ligo')
student.read()
# 学生ligo的学校是北京大学
# (2)类调用绑定给对象的方法,需要主动传入一个生成的对象
Student.read(student)
# 学生ligo的学校是北京大学

【2】绑定给类的方法

  • 对象和类都可以任意调用的方法
  • classmehtod是给类用的,即绑定到类
  • 类在使用时会将类本身当做参数传给类方法的第一个参数
class Student(object):
    school = '北京大学'

    def __init__(self, name):
        self.name = name

    @classmethod
    def read(cls,*args, **kwargs):
        obj = cls(*args, **kwargs)
        print(f"学生{obj.name}的学校是{obj.school}")


# (1)对象调用绑定给类的方法, 默认将实例化得到当前对象的类自动传入
student = Student('ligo')
student.read('ligo')
# 学生ligo的学校是北京大学
# (2)类调用绑定给类的方法,类可以直接调用,默认将调用当前方法的类自动传入
Student.read('scott')
# 学生scott的学校是北京大学

【三】非绑定方法

  • 在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数
  • statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果
class Student(object):
    school = '北京大学'

    def __init__(self, name):
        self.name = name

    @staticmethod
    def read():
        print(f"学生{student.name}的学校是{Student.school}")


# (1)对象调用非绑定方法, 不用传任何参数,直接调用
student = Student('ligo')
student.read()
# 学生ligo的学校是北京大学
# (2)类调用非绑定方法, 不用传任何参数,直接调用
Student.read()
# 学生ligo的学校是北京大学
posted @ 2024-05-10 18:43  Ligo6  阅读(62)  评论(0)    收藏  举报