¥面向对象,绑定方法和非绑定方法¥

绑定方法和非绑定方法

  • 我们想让类和对象都能用某一个方法

【一】绑定方法

(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 装饰的函数

  • 特征不会自动补全任何参数

  • 对象调用直接调用

  • 类调用直接调用

    • 类调用直接调用

  • 就像一个普通函数

    • 类名.函数名()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值