第七章 面向对象(10):绑定方法与非绑定方法(静态方法)

什么是绑定方法,非绑定方法

  • 在内部定义的函数分为两大类:
    • 绑定方法:绑定给谁,就应该由谁调用。谁调用就会把调用者当做第一个参数自动传入
      • 绑定到对象方法:在类内定义的没有被任何装饰器修饰的方法
      • 绑定到类的方法:在类内定义的被@classmethod装饰的方法
    • 非绑定方法(静态方法):没有自动传值,就是类中的一个普通的工具
      • 不与类或者对象绑定
class Foo:
    def __init__(self, name):  # 这其实就是个绑定对象的方法
        self.name = name
        
    def tell(self):  # 绑定对象的方法
        print('name is:',self.name)
        
    @classmethod
    def func(cls):  # 
        print(cls)
    
    @staticmethod
    def func1(x, y):  # 非绑定方法(静态方法),不会自动传参
        return x + y
        

print(Foo.tell)  # 我们可以看到用类调用的话,就是个函数类型:function

# 绑定对象的方法
f = Foo('a')
print(f.tell)  # 我们可以看到,对象调用的话,是一个绑定方法类型:bound method

# 绑定类的方法
print(Foo.func)  # 用类调用也是一个绑定方法类型:bound method
Foo.func()  # 这时候cls = Foo
# f.func()  # 即使是对象调用依然是其类调用的,即cls = Foo。不过绑定到类的应该由类来调用,所以不这么写

# 非绑定方法,使用的时候就当一般的函数来用就可以了。
print(Foo.func1)  # 是个函数类型:function
print(f.func1)  # 是个函数类型:function

绑定方法与非绑定方法的应用

我们用下面的代码例来示范一下绑定方法,非绑定方法的使用:

import hashlib
import time

dict1 = {'name': 'a', 'age': 20, 'sex': '男'}

class People:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.id = self.create_id()  # 调用非绑定方法来赋值

    def tell_info(self):
        print('Name:%s Age:%s Sex:%s' % (self.name, self.age, self.sex,))

    @classmethod
    def from_conf(cls, conf_dict):  # 这里我们用字典初始化了一个对象,由于是从类调用,自动传入类本身作为参数,所以定义成绑定类的方法
        obj = cls(
            conf_dict['name'],
            conf_dict['age'],
            conf_dict['sex']
        )
        return obj

    @staticmethod
    def create_id():  # 这个函数并不需要自动传入任何类和对象有关的参数,所以是一个一般参数,所以定义成非绑定方法
        m = hashlib.md5(str(time.time()).encode('utf-8'))
        return m.hexdigest()


p1 = People('x', 11, '女')
time.sleep(0.00005)  # 为了防止id一样,我们加一个延迟
p2 = People('y', 10, '女')
time.sleep(0.00005)

# 用类绑定方法实例化一个对象
p3 = People.from_conf(dict1)  # 直接调用类的方法返回一个对象出来
print(p3.__dict__)

# 查看非绑定方法生成的id
print(p1.id)
print(p2.id)
print(p3.id)

执行结果:

{'name': 'a', 'age': 20, 'sex': '男', 'id': 'e3c89723b7de3f6bc7b7438af764b04d'}
0a254de3e2ac2d55795cb1e2834ca031
6352348ab3ce1217e21895010ee1f202
e3c89723b7de3f6bc7b7438af764b04d

猜你喜欢

转载自www.cnblogs.com/py-xiaoqiang/p/11210459.html
今日推荐