Python-类的绑定方法与非绑定方法
2024-10-11 17:04:09
类中定义的函数分成两大类
一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):
绑定到类的方法:用classmethod装饰器装饰的方法。
为类量身定制 类.boud_method(),自动将类当作第一个参数传入 (其实对象也可调用,但仍将类当作第一个参数传入)
绑定到对象的方法:没有被任何装饰器装饰的方法。
为对象量身定制 对象.boud_method(),自动将对象当作第一个参数传入 (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
二:非绑定方法:用staticmethod装饰器装饰的方法
- 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值
绑定方法
classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法
#settings.py
HOST='127.0.0.1'
PORT=3306
class MySQL:
def __init__(self,host,port):
self.host=host
self.port=port @classmethod
def from_conf(cls):
print(cls)
return cls(settings.HOST,settings.PORT) print(MySQL.from_conf) #<bound method MySQL.from_conf of <class '__main__.MySQL'>>
conn=MySQL.from_conf() conn.from_conf() #对象也可以调用,但是默认传的第一个参数仍然是类
非绑定方法
在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数
statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果
class MySQL:
def __init__(self,host,port):
self.id=self.create_id()
self.host=host
self.port=port
@staticmethod
def create_id(): #就是一个普通工具
m=hashlib.md5(str(time.time()).encode('utf-8'))
return m.hexdigest() print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #查看结果为普通函数
classmethod与staticmethod的对比
import settings
class MySQL:
def __init__(self,host,port):
self.host=host
self.port=port @staticmethod
def from_conf():
return MySQL(settings.HOST,settings.PORT) # @classmethod #哪个类来调用,就将哪个类当做第一个参数传入
# def from_conf(cls):
# return cls(settings.HOST,settings.PORT) def __str__(self):
return '就不告诉你' class Mariadb(MySQL):
def __str__(self):
return '<%s:%s>' %(self.host,self.port) m=Mariadb.from_conf()
print(m) #我们的意图是想触发Mariadb.__str__,但是结果触发了MySQL.__str__的执行,打印就不告诉你:
最新文章
- Proguard参数
- JSON和数据集互相转换单元
- 欧拉回路(hdu3018)
- C# 中正确实现 IDisposable 接口
- 从css3书写顺序引出来的border-radius参数
- jmeter断言
- Gmail新版截图曝光 你还能认得出来吗?
- BootStrap2学习日记2--将固定布局换成响应式布局
- JS,JQuery杂谈
- EF 接收OUTPUT参数的方法 How to Retrieve Stored Procedure Output Parameters in Entity Framework
- 获取 修改 CSS 样式
- 小谈SQL表的连接
- Python3 循环
- Git运用基础之如何删除Github上不想要的项目
- Integer简介
- poj 3641 快速幂
- ZOJ - 2423-Fractal
- nginx配置文件注释说明
- 运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)
- 【T10】记住,TCP__IP不是轮询的
热门文章
- [20181229]关于字符串的分配问题.txt
- [20181116]18c DML 日志优化.txt
- [20181007]12cR2 Using SQL Patch 2.txt
- 4. svg学习笔记-文档结构元素和样式的使用
- 联想x3650m5服务器安装windows2008R2系统
- 【2018.08.13 C与C++基础】网络通信:阻塞与非阻塞socket的基本概念及简单实现
- css点滴3—5种方式实现圆环
- keepalived 安装篇-个人实践-编译安装
- 轮播图插件swiper 的使用
- js 性能篇--dom 重绘 重排 节流