• 绑定方法与非绑定方法


    '''
    1、绑定方法
    特性:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
    《《《精髓在于自动传值》》》

    绑定方法分为两类:
    1.1 绑定给对象方法
    在类内部定义的函数(没有被任何装饰器修饰的),默认就是绑定给对象用的
    1.2 绑定给类的方法:
    在类内部定义的函数如果被装饰器@classmethod装饰,
    那么则是绑定给类的,应该由类来调用,类来调用就自动将类当作第一个参数自动传入



    2、非绑定方法
    类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法
    既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用
    但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数





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


    '''

    class Foo:
    @classmethod # 绑定给类的,类Foo会被自动传入给第一个参数cls
    def f1(cls):
    print(cls)

    def f2(self):
    print(self)


    obj=Foo()
    # print(obj.f2)
    # print(Foo.f1)
    #
    # Foo.f1() # 类绑定了f1 Foo作为第一个参数传入 可打印cls验证
    # print(Foo)


    #1、f1绑定给类的
    # 了解:绑定给类的应该由类来调用,但对象其实也可以使用,只不过自动传入的仍然是类
    # print(Foo.f1)
    # print(obj.f1)
    # Foo.f1()
    # obj.f1() # 对象也可以调用,只不过传入的依然是类
    # <class '__main__.Foo'> # 打印cls的值
    # <class '__main__.Foo'> # 打印cls的值

    #2、f2是绑定给对象的
    # obj.f2()
    # Foo.f2(obj)

    import settings
    import uuid

    class Mysql:
    def __init__(self,ip,port):
    self.uid=self.create_uid()
    self.ip=ip
    self.port=port

    def tell_info(self):
    print('%s:%s' %(self.ip,self.port))

    @classmethod # 绑定类 cls相当于Mysql
    def from_conf(cls):
    return cls(settings.IP, settings.PORT) # Mysql(settings.IP, settings.PORT)
    # cls自动接收Mysql传入,Mysql(settings.IP, settings.PORT)调用类生成对象obj,触发__init__,
    # 初始化obj里的属性,uid赋值触发creat_uid方法,返回uid值。
    @staticmethod
    def func(x,y):
    print('不与任何人绑定')

    @staticmethod
    def create_uid():
    return uuid.uuid1()

    # 默认的实例化方式:类名(..)
    # obj=Mysql('10.10.0.9',3307)

    # 一种新的实例化方式:从配置文件中读取配置完成实例化
    obj1=Mysql.from_conf()
    # obj1.tell_info()
    #
    # obj.func(1,2)
    # Mysql.func(3,4)
    # print(obj.func)
    # print(Mysql.func)

    # print(obj.uid)
    print(obj1.uid)
  • 相关阅读:
    luogu 2478 [SDOI2010]城市规划 仙人掌上dp.
    bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp
    bzoj 3790 神奇项链 回文串 manacher|PAM
    4.4 相交弧 容斥 平衡规划 二维数点
    4.4 省选模拟赛 拉格朗日计数 树状数组+容斥.
    4.4 省选模拟赛 修路 斯坦纳树
    带修改线性基
    CF R 630 div2 1332 F Independent Set
    4.3 省选模拟赛 石子游戏 树上博弈
    机器C盘临时区
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9239326.html
Copyright © 2020-2023  润新知