08-05 绑定方法与非绑定方法

一. 绑定方法与非绑定方法介绍

# 注意!!: 绑定方法与非绑定方法存在的意义就是修改类中函数的一种归属, 让类中函数发挥最大的作用.
"""
类中定义的函数分为两大类:绑定方法和非绑定方法
    绑定方法: 绑定到对象的方法和绑定到类的类方法
    非绑定方法: 该方法不与类或对象绑定
"""

二. 绑定方法: 特殊之处在于将调用者本身当做第一个参数自动传入

# 绑定方法: 绑定到类的方法@classmethod
"""
设计者可以通过@classmethod装饰器来提供一种给类使用的接口, 用来提供一种新的使用类造对象的方式
"""
import settings

'''
当前执行文件下创建settings.py, 放入一下代码: 
IP = '127.0.0.1'
PORT = 8080
'''

class MySql:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    def tell_info(self):
        print(f'{self.ip}:{self.port}')

    print(classmethod)  # <class 'classmethod'>

    @classmethod  # 类装饰器classmethod, 将下面的函数装饰成绑定给类的方法
    def from_conf(cls):
        print(cls)
        return cls(settings.IP, settings.PORT)


# 1. 使用类直接实例化创建对象
obj = MySql(settings.IP, settings.PORT)
obj.tell_info()

# 2. 使用类方法提供的接口来创建对象
obj1 = MySql.from_conf()
obj1.tell_info()

三. 非绑定方法/静态方法

# 注意!!: 非绑定方法没有绑定给任何人:调用者可以是类、对象,没有自动传参的效果
"""
没有绑定给任何人:调用者可以是类、对象,没有自动传参的效果
"""
class MySql:
    def __init__(self, ip, port):
        self.uuid = self.create_id()
        self.ip = ip
        self.port = port

    @staticmethod  # 将下述函数装饰成一个静态方法
    def create_id():
        import uuid
        return uuid.uuid4()

    @classmethod
    def f1(cls):
        pass

    def f2(self):
        pass


obj1 = MySql('1.1.1.1', 3306)

print(obj1.create_id)  # 被静态方法装饰对象就是类中一个普通的函数. <function MySql.create_id at 0x000002037B9CCDC0>

# 对象的绑定方法, 类的绑定方法与之对比
print(obj1.f2)  # <bound method MySql.f2 of <__main__.MySql object at 0x000002C07E59FC10>>
print(obj1.f1)  # <bound method MySql.f1 of <class '__main__.MySql'>>

# 静态方法对象或者类调用都是一个普通的函数没有自动传参的效果
print(obj1.create_id())
print(MySql.create_id())
posted @ 2020-04-10 23:22  给你加马桶唱疏通  阅读(159)  评论(0编辑  收藏  举报