Python 绑定方法与非绑定方法

发布时间:2019-03-03 09:59:08编辑:auto阅读(2150)

    用到的:

      import uuid  --------------  uuid是128位的全局唯一标识符, 通常用32位的一个字符串的形式来表现

      uuid.uuid1()  -------------  基于MAC地址,时间戳,随机数来生成唯一的uuid,可以保证全球范围内的唯一性

      uuid.uuid3()  -------------  通过计算一个命名空间和名字的md5散列值来给出一个uuid,所以可以保证命名空间中的不同名字具有不同的uuid,但是相同的名字就是相同的uuid了

      uuid.uuid4()  -------------  通过伪随机数得到uuid,是有一定概率重复的

      uuid.uuid5()  -------------  和uuid3基本相同,只不过采用的散列算法是sha1

      @classmethod  ---------  加入到定义给类的绑定方法上(绑定给类的应该有类来调用, 但对象其实也可以使用, 只不过自动传入的仍然是类)

      @staticmethod  ---------  加入到定义的非绑定方法函数上(但是无论谁来调用, 都没有任何自动传值的效果, 就是一个普通函数)

    1. 绑定方法

    特性: 绑定给谁就应该由谁来调用, 谁来调用就会将谁当作第一个参数自动传入<<精髓在于自动传值>>

    绑定方法分为两类:

      1. 绑定给对象方法:

        在类内部定义的函数(没有被任何装饰器修饰的), 默认就是绑定给对象用的

      2.绑定给类的方法:

        在类内部定义的函数如果被装饰器@classmethod装饰, 那么则是绑定给类的, 应该由类来调用, 类来调用就自动将类当作第一个参数自动传入

     

    2. 非绑定方法

    类中定义的函数如果被装饰器@staticmethod装饰, 那么该函数就变成非绑定方法

    既不与类绑定, 又不与对象绑定, 意味着类与对象都可以来调用

    但是无论谁来调用, 都没有任何自动传值的效果, 就是一个普通函数

     

    3.应用

    如果函数体代码需要用外部传入的类, 则应该将该函数定义成绑定给类的方法

    如果函数体代码需要用外部传入的对象, 则应该将该函数定义成绑定给对象的方法

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

     例如:

     1 class Foo:
     2     @classmethod
     3     def f1(cls):
     4         print(cls)
     5 
     6     def f2(self):
     7         print(self)
     8 
     9 obj = Foo()
    10 
    11 print(obj.f2)
    >>><bound method Foo.f2 of <__main__.Foo object at 0x000001F2D4AFCCC0>>
    12 print(Foo.f1)
    >>><bound method Foo.f1 of <class '__main__.Foo'>>
    13 Foo.f1()
    >>><class '__main__.Foo'>
    14 print(Foo)
    >>><class '__main__.Foo'>

    f1是绑定给类的

    绑定给类的应该有类来调用, 但对象其实也可以使用, 只不过自动传入的仍然是类

    1 print(Foo.f1)
    >>><bound method Foo.f1 of <class '__main__.Foo'>>
    2 print(obj.f1)
    >>><bound method Foo.f1 of <class '__main__.Foo'>>
    3 Foo.f1()
    >>><class '__main__.Foo'>
    4 obj.f1()
    >>><class '__main__.Foo'>

    f2是绑定给对象的

    1 obj.f2()
    >>><__main__.Foo object at 0x00000203677CCCF8>
    2 Foo.f2(obj)
    >>><__main__.Foo object at 0x00000203677CCCF8>

     

    例子(打印ip和端口):

     1 import settings
     2 import uuid
     3 
     4 class Mysql:
     5     def __init__(self, ip, port, net):
     6         self.uid = self.create_uid()
     7         self.ip = ip
     8         self.port = port
     9         self.net = net
    10 
    11     def tell_info(self):
    12         print('%s:%s' % (self.ip, self.port))
    13 
    14     @classmethod
    15     def from_conf(cls):
    16         return cls(settings.IP, settings.NET, settings.PORT)
    17 
    18     @staticmethod
    19     def func(x, y):
    20         print('不与任何人绑定')
    21 
    22     @staticmethod
    23     def create_uid():
    24         return uuid.uuid1()

    默认的实例化方式: 类名(...)

    obj = Mysql('10.10.0.9',3307)

    一种新的实例化方式: 从配置文件中读取配置完成实例化

    1 obj1 = Mysql.from_conf()
    2 obj1.tell_info()
    1 obj.func()
    >>>不与任何人绑定
    2 Mysql.func()
    >>>不与任何人绑定
    3 print(obj.func)
    >>><function Mysql.func at 0x000002B7DF688A60>
    4 print(Mysql.func)
    >>><function Mysql.func at 0x000002B7DF688A60>

     

关键字