用到的:

  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.应用

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

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

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

例如:

 class Foo:
@classmethod
def f1(cls):
print(cls) def f2(self):
print(self) obj = Foo() print(obj.f2)
>>><bound method Foo.f2 of <__main__.Foo object at 0x000001F2D4AFCCC0>>
print(Foo.f1)
>>><bound method Foo.f1 of <class '__main__.Foo'>>
Foo.f1()
>>><class '__main__.Foo'>
print(Foo)
>>><class '__main__.Foo'>

f1是绑定给类的

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

 print(Foo.f1)
>>><bound method Foo.f1 of <class '__main__.Foo'>>
print(obj.f1)
>>><bound method Foo.f1 of <class '__main__.Foo'>>
Foo.f1()
>>><class '__main__.Foo'>
obj.f1()
>>><class '__main__.Foo'>

f2是绑定给对象的

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

例子(打印ip和端口):

 import settings
import uuid class Mysql:
def __init__(self, ip, port, net):
self.uid = self.create_uid()
self.ip = ip
self.port = port
self.net = net def tell_info(self):
print('%s:%s' % (self.ip, self.port)) @classmethod
def from_conf(cls):
return cls(settings.IP, settings.NET, settings.PORT) @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()
>>>不与任何人绑定
Mysql.func()
>>>不与任何人绑定
print(obj.func)
>>><function Mysql.func at 0x000002B7DF688A60>
print(Mysql.func)
>>><function Mysql.func at 0x000002B7DF688A60>

Python 绑定方法与非绑定方法的更多相关文章

  1. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  2. 全面解析python类的绑定方法与非绑定方法

    类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...

  3. Python开发基础-Day21多态与多态性、绑定方法和非绑定方法

    多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...

  4. python基础之多态与多态性、绑定方法和非绑定方法

    多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...

  5. Python面向对象之封装、property特性、绑定方法与非绑定方法

    一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...

  6. Day 5-5 绑定方法与非绑定方法

    绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...

  7. Learning-Python【25】:绑定方法与非绑定方法

    类中定义函数分为了两大类,绑定方法与非绑定方法,它们有一些特殊之处: 1.绑定方法特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法:这个在面向对象第一篇第六 ...

  8. day22-类的封装、property特性以及绑定方法与非绑定方法

    目录 类的封装 两个层面的封装 第一个层面 第二个层面 封装的好处 私有模块 类的propertry特性 setter 和 deleter 类与对象的绑定方法与非绑定方法 类的封装 将类的属性或方法隐 ...

  9. 类的封装,property特性,类与对象的绑定方法和非绑定方法,

    类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...

  10. Python--多态与多态性、绑定方法与非绑定方法

    多态与多态性 多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组. s='hello' l=[,,] t=('a',' ...

随机推荐

  1. VS2010 AnkhSvn

    有时候打开别的项目用的是 TFS等 造成 VS本来用的AnkhSvn失效了 .工具---选项----插件选择---

  2. mybatis基础学习4-插件生成器(根据数据库的表生成文件)

    1:安装(根据数据库的表生成文件) 2:在所建项目单击右键输入mybatis如下图 *建项目文件时不用建包和类,插件可以根据数据表自动生成,在配置文件(generatorConfig.xml)里写即可 ...

  3. markdown(语法)入门学习:

    原文链接:https://segmentfault.com/a/1190000010223222#articleHeader9 1.标题 注:#后面保持空格 # h1 ## h2 ### h3 ### ...

  4. bzoj 1898: [Zjoi2005]Swamp 沼泽鳄鱼【dp+矩阵快速幂】

    注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include ...

  5. Luogu P1233 木棍加工 【贪心/LIS】

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...

  6. _bzoj1008 [HNOI2008]越狱【计数】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1008 水题... #include <cstdio> const int mod ...

  7. 《白书》上线段树RMQ的实现

    白书上的线段树RMQ实现,自己重写了一遍: #include <bits/stdc++.h> using namespace std; const int MAXN=1<<17 ...

  8. java基础(六):RabbitMQ 入门

    建议先了解为什么项目要使用 MQ 消息队列,MQ 消息队列有什么优点,如果在业务逻辑上没有此种需求,建议不要使用中间件.中间件对系统的性能做优化的同时,同时增加了系统的复杂性也维护难易度:其次,需要了 ...

  9. 掌握Spark机器学习库-07-随机梯度下降

    1)何为随机梯度下降 优化方法 迭代更新,来寻找函数全局最优解的方法 与最小二乘法相比:适用于变量众多,模型更复杂 2)梯度 变化最快,“陡峭” 通过函数表达式来衡量梯度 3)随机梯度下降原理推导过程 ...

  10. 【原创】如何编写c#用户登陆后用户名在前台显示

    这种肯定是判断session啦!!!!! @{ string username = (string)Session["username"]; user user = new use ...