• 类和对象的绑定方法和非绑定方法


    类和对象的绑定方法和非绑定方法

    类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。

    绑定方法,主要的特殊之处,绑定给谁就是谁来调用,并且会把自身(对象self)传过来
    类的绑定方法:绑定给类的,类来调用,会把类自身传递过来

    一、绑定方法

    1.1 对象的绑定方法

    在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制。

    class Person:
        country = "China"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def speak(self):
            print(self.name + ', ' + str(self.age))
    
    
    p = Person('laowang', 18)
    print(p.__dict__)
    

    {'name': 'laowang', 'age': 18}

    print(Person.__dict__['speak'])
    

    <function Person.speak at 0x10f0dd268>

    speak即为绑定到对象的方法,这个方法不在对象的名称空间中,而是在类的名称空间中。

    通过对象调用绑定到对象的方法,会有一个自动传值的过程,即自动将当前对象传递给方法的第一个参数(self,一般都叫self,也可以写成别的名称);若是使用类调用,则第一个参数需要手动传值。

    p = Person('laowang', 18)
    p.speak()  # 通过对象调用
    Person.speak(p)  # 通过类调用
    

    1.2 类的绑定方法

    类中使用 @classmethod 修饰的方法就是绑定到类的方法。这类方法专门为类定制。通过类名调用绑定到类的方法时,会将类本身当做参数传给类方法的第一个参数。

    类的绑定方法用在什么地方?
    不需要通过对象进行调用,只需要通过类就能获取到一些东西的时候,使用类的绑定方法
    类的绑定方法也可以由对象来调用(一般使用很少)

    class Person:
        def __init__(self, name, age):
            print(self)
            self.name = name
            self.age = age
    
        @classmethod
        def test(cls):
            print(cls)
            print("类的绑定方法")
            # 类实例化产生对象,返回
            return cls('laowang', 19)
    
        @classmethod
        def get_obj_by_name(cls, name):
            #  1. 去文件中查找名字name中pickle文件
            # 2.反序列化成对象
            # 3 return 返回对象
            pass
    
    
    p = Person.test()
    print(p.name)
    
    # 使用对象调用
    # 通过对象也可以调用,只是默认传递的第一个参数还是这个对象对应的类。
    p1 = Person("laowang2", 30)
    p1.test()
    print(p1.name)
    print("*" * 30)
    
    # 类名
    print(Person.__name__)
    print(Person.__dict__)
    print(Person.__class__)
    
    • 总结:

      1. @clssmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法

        1. 类的绑定方法有类来调用,自动把类传过去,对象也可以调用,一般不用
        2. 类的绑定方法用在什么地方?, 不需要通过对象,只需要通过类就能完成某些事的时候,就把该方法定义为类的绑定方法

    二、非绑定方法(静态方法)

    staticmethod:非绑定方法,定义在类内部,就是一个普通的方法,谁都不绑定
    对象/类都可以调用,但是不会自动传值,他就是一个普通的函数,想把函数拿到类中管理,就可以定义静态方法

    在类内部使用 @staticmethod 修饰的方法即为非绑定方法,这类方法和普通定义的函数没有区别,不与类或对象绑定,谁都可以调用,且没有自动传值的效果。

    import hashlib
    
    class Operate_database():
        def __init__(self, host, port, user, password):
            self.host = host
            self.port = port
            self.user = user
            self.password = password
            self.id = self.get_uuid()
    
        @staticmethod
        def get_passwrod(salt, password):
            m = hashlib.md5(salt.encode('utf-8'))  # 加盐处理
            m.update(password.encode('utf-8'))
            return m.hexdigest()
        
        @staticmethod
        def get_uuid():
            return uuid.uuid4()
    
    
    hash_password = Operate_database.get_passwrod('lala', '123456')  # 通过类来调用
    print(hash_password)
    print(p.id)
    

    f7a1cc409ed6f51058c2b4a94a7e1956

    p = Operate_database('192.168.0.5', '3306', 'abc', '123456')
    hash_password = p.get_passwrod(p.user, p.password)  # 也可以通过对象调用
    print(hash_password)
    

    0659c7992e268962384eb17fafe88364

    简而言之,非绑定方法就是将普通方法放到了类的内部。

    如果函数体代码既不需要外部传入的类也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数

    三、总结

    绑定方法:

    1. @clssmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法

    2. 类的绑定方法有类来调用,自动把类传过去,对象也可以调用,一般不用

    3. 类的绑定方法用在什么地方?, 不需要通过对象,只需要通过类就能完成某些事的时候,就把该方法定义为类的绑定方法

    非绑定方法:

    1. @staticmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法
    2. 非绑定方法就是将普通方法放到了类的内部。
    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    剑指offer 整数中1出现的次数(从1到n整数中1出现的次数)
    剑指offer 把数组排成最小的数
    剑指offer 丑数
    剑指offer 字符串的排列
    剑指offer 数组中出现次数超过一半的数字
    剑指offer 最小的K个数
    操作系统 页面置换算法(C++实现)
    剑指offer 二叉搜索树与双向链表
    剑指offer 复杂链表的复制
    操作系统 银行家算法(C++实现)
  • 原文地址:https://www.cnblogs.com/randysun/p/11430044.html
Copyright © 2020-2023  润新知