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',' ...
随机推荐
- MFC优秀博客记录 鸡啄米
最近在学习和利用C++ MFC做一些小的应用,发现鸡啄米先生的教程很不错适合新手,在这就把自己实现的一些小demo分享一下: C++编程入门系列之目录和总结 第一部分:C++编程概述 第二部分:C++ ...
- (博弈论 高精度小数)51NOD 1185 威佐夫游戏 V2
有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...
- layui table 详细讲解
layui.use('table', function () { var table = layui.table; /*第一种原始写法*/ ...
- 转】[1.0.2] 详解基于maven管理-scala开发的spark项目开发环境的搭建与测试
场景 好的,假设项目数据调研与需求分析已接近尾声,马上进入Coding阶段了,辣么在Coding之前需要干马呢?是的,“统一开发工具.开发环境的搭建与本地测试.测试环境的搭建与测试” - 本文详细记录 ...
- LBP特征 学习笔记
这几天一直在做人脸识别的项目,有用到LBP特征,但是毫无头绪,师姐这几天也比较忙,没有时间来指导我,随自己找相应的介绍LBP的博文来看,现在总算有了一个大体的思路了,就写下来吧 注:参考博文: 目标检 ...
- [ZPG TEST 108] Antimonotonicity【贪心】
T2:Antimonotonicity (Antimonotonicity.pas/in/out 128M 1s) 给你1-N的一个排列,数列中的数字互不相等,要求找出最长的子序列a,满足a1> ...
- 自定义View(12)绘制.9图片
代码如下: // 绘制.9图片 void draw9Path(Canvas canvas){ //创建一个ninePatch的对象实例,第一个参数是bitmap.第二个参数是byte[],这里其实要求 ...
- iOS开发之邮件发送代码
邮件发送功能是由MessageUI Framework提供的,这个框架是iPhone sdk中最简单的框.由一个类.一个视图控制器,一个protocol组成. 一.创建视图控制器: MFMailCom ...
- 189 Rotate Array 旋转数组
将包含 n 个元素的数组向右旋转 k 步.例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7] ,向右旋转后的结果为 [5,6,7,1,2,3,4].注意:尽可能找 ...
- 229 Majority Element II 求众数 II
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 你的算法应该在O(1)空间中以线性时间运行. 详见:https://leetcode.com/problems/major ...