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

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

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

绑定方法,主要的特殊之处,绑定给谁就是谁来调用,并且会把自身(对象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. 非绑定方法就是将普通方法放到了类的内部。
posted @ 2019-08-29 15:43  RandySun  阅读(390)  评论(0编辑  收藏  举报