Python 绑定方法与非绑定方法
用到的:
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.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- 全面解析python类的绑定方法与非绑定方法
类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...
- Python开发基础-Day21多态与多态性、绑定方法和非绑定方法
多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...
- python基础之多态与多态性、绑定方法和非绑定方法
多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...
- Python面向对象之封装、property特性、绑定方法与非绑定方法
一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...
- Learning-Python【25】:绑定方法与非绑定方法
类中定义函数分为了两大类,绑定方法与非绑定方法,它们有一些特殊之处: 1.绑定方法特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法:这个在面向对象第一篇第六 ...
- day22-类的封装、property特性以及绑定方法与非绑定方法
目录 类的封装 两个层面的封装 第一个层面 第二个层面 封装的好处 私有模块 类的propertry特性 setter 和 deleter 类与对象的绑定方法与非绑定方法 类的封装 将类的属性或方法隐 ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- Python--多态与多态性、绑定方法与非绑定方法
多态与多态性 多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组. s='hello' l=[,,] t=('a',' ...
随机推荐
- Veeam对于新病毒防御的建议
Veeam对于新病毒防御的建议 前言 勒索软件GandCrab 上周末,在我们大家晒娃和欢度六一的时候.勒索软件分发平台 GandCrab 宣布将在一个月内关闭其RaaS(勒索软件即服务)业务平台.据 ...
- 标准块CP功能实现
#include<stdio.h> int main(int argc,char *argv[]) { FILE *src_fp,*des_fp; int src_ret; ]={}; ) ...
- [ZPG TEST 108] Antimonotonicity【贪心】
T2:Antimonotonicity (Antimonotonicity.pas/in/out 128M 1s) 给你1-N的一个排列,数列中的数字互不相等,要求找出最长的子序列a,满足a1> ...
- VS2010下安装Opencv 分类: Opencv 2014-11-02 13:51 778人阅读 评论(0) 收藏
Opencv作为一种跨平台计算机视觉库,在图像处理领域得到广泛的应用,下面介绍如何在VS2010中安装配置Opencv 一.下载Opencv 下载网址:http://sourceforge.net/p ...
- 图形化unix/linux 工具 mobarxterm
1.使用 mobarxterm 图形化登录工具 2. 如果服务器是图形化界面启动的,xhost +命令可以不用执行 [root@test ~]# xhost +xhost: unable to o ...
- (三)SpringIoc之初了解
IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来 ...
- Javascript数据结构之栈
作者原文:http://hawkzz.com/blog/blog/1515054561771 定义 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种先入后出的数据结构 ...
- 第二章 TCP/IP 基础知识
第二章 TCP/IP 基础知识 TCP/IP transmission control protocol and ip internet protocol 是互联网众多通信协议中最为著名的. ...
- 有意思的String字符工具类
对String的操作是Java攻城师必备的,一个优秀的攻城师是懒惰,他会把自己的一些常见的代码写成可提供拓展和复用的工具类或者工具库,这些是这些优秀工程师的法宝. 我就先从String这个基本操作开始 ...
- OC语言Block 续
OC语言 Block 转载:http://blog.csdn.net/weidfyr/article/details/48138167 1.Block对象中的变量行为 结论: 在block代码块内部可 ...