类内部装饰器的使用:property、classmethod与staticmethod
1、property
property是一种特殊的属性,可实现把函数名变为属性名使用。它可以在不改变类接口的前提下使用存取方法 (即读值和取值)
来修改数据的属性,property类有3个方法getter(读操作)、setter(赋值操作)、deleter(删除操作),分别把对应的操作
绑定到指定的函数实现,应用如下:
class People:
def __init__(self,name,weight,height):
self.name=name
self.wt=weight
self.ht=height @property
def bmi(self):
return self.wt / (self.ht ** 2) @property #便于用户访问隐藏的内部值name
def name(self):
return self.__name @name.setter #便于用户 修改name值
def name(self,obj): #obj='EGON'
if not isinstance(obj,str):
raise TypeError('名字的值必须是str类型')
self.__name=obj #self.__name='EGON' @name.deleter
def name(self):
del self.__name p=People('egon',75,1.80)
# print(p.bmi) # print(p.name)
# p.name='EGON'
# p.name=123 #报错
# print(p.name) # del p.name #删除name
2、classmethod
(1)绑定到对象的方法:在类内部没有任何修饰的情况下直接定义一个方法默认绑定一个self给对象来用
class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port def tell_info(self):
print("<%s:%s>" %(self.host,self.port)) conn1=Mysql('127.0.0.1',8080)
conn1.tell_info()
(2)绑定到类的方法:当函数体代码需要传进来的参数不再是对象了,而是类的时候。
以下是实现从配置文件里读IP和端口,完成实例化的程序:
HOST='1.1.1.1'
PORT=8080
settings
import settings class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port def tell_info(self):
print("<%s:%s>" %(self.host,self.port)) @classmethod #绑定给类,由类来掉,把它当做第一个参数传进来完成实例化,再把结果返回
def from_conf(cls):
return cls(settings.HOST, settings.PORT) conn2=Mysql.from_conf() print(conn2.tell_info)
conn2.tell_info() # 打印结果:<bound method Mysql.tell_info of <__main__.Mysql object at 0x00C9CFF0>>
<1.1.1.1:8080>
3、staticmethod
非绑定方法,不与任何东西绑定,定义的函数不需要任何东西传进来
import uuid class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port @staticmethod
def create_id():
return uuid.uuid4() print(Mysql.create_id)
print(Mysql.create_id()) #打印结果:<function Mysql.create_id at 0x02C6EC90> 2209806a-5ffc-47f2-86f1-cb2ac64ce404
整体代码:
import settings
import uuid class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port def tell_info(self):
print("<%s:%s>" %(self.host,self.port)) @classmethod
def from_conf(cls):
return cls(settings.HOST, settings.PORT) @staticmethod
def create_id():
return uuid.uuid4() conn1=Mysql('127.0.0.1',8080)
conn1.tell_info() conn2=Mysql.from_conf()
conn2.tell_info()
print(conn2.tell_info) print(Mysql.create_id)
print(Mysql.create_id()) #打印结果:<127.0.0.1:8080> <1.1.1.1:8080> <bound method Mysql.tell_info of <__main__.Mysql object at 0x038294B0>> <function Mysql.create_id at 0x03831E40> bab5e25e-7de3-4273-a8cf-40829c716d87
类内部装饰器的使用:property、classmethod与staticmethod的更多相关文章
- python 类内部装饰器的实现 与 参数解构学习
学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢, 在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题class Ctj(): clas ...
- day28-描述符应用与类的装饰器
#!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
- 11.python描述符---类的装饰器---@property
描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- day8_类的装饰器和反射
""" 类的装饰器: @property 当类的函数属性声明 @property后, 函数属性不需要加括号 即可调用 @staticmethod 当类的函数属性声明 @s ...
- Python全栈day28(类的装饰器)
类是一个对象也可以像函数一样加装饰器 类的装饰器.py def deco(obj): print('======',obj) obj.x=1 obj.y=2 obj.z=3 return obj # ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- django class类即视图类添加装饰器的几种方法
根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 第一种:定义函数装饰器,在函数,类中使用函 ...
随机推荐
- SpringCloud微服务架构和SOA架构
1,传统的三层架构 在传统的架构中,SSH,SSM,主要分为web 控制层,业务逻辑层,数据库访问层,单点项目,项目没有拆分,所有的开发任务全部写在一个项目中,耦合度比价高,如果程序中的一个功能出现了 ...
- HTTP 请求状态码
200 请求成功 304 从缓存中读取 302 + 响应头中定义location: 重定向 // 自定义重定向 @RequestMapping("/customRedirecti ...
- 硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林 ...
- [洛谷1437&Codevs1257]敲砖块<恶心的dp>
题目链接:https://www.luogu.org/problem/show?pid=1437#sub http://codevs.cn/problem/1257/ 不得不说,这个题非常的恶心,在初 ...
- EXPLAIN 查看 SQL 执行计划
EXPLAIN 查看 SQL 执行计划.分析索引的效率: id:id 列数字越大越先执行: 如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. ...
- Netty为什么不直接用AtomicXXX,而要用AtomicXXXFieldUpdater去更新变量呢?
更多技术分享可关注我 前言 如果仔细阅读过Netty的线程调度模型的源码,或者NIO线程对象及其线程池的创建源码,那么肯定会遇到类似“AtomicIntegerFieldUpdater”的身影,不禁想 ...
- 在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
在这篇文章中,我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业.这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态.接下来我将演示如何创建一个简 ...
- Ptask
这是一款非常弱鸡的小程序,不喜勿喷 你们好!如在使用中有bug或者有您宝贵的建议请在下方评论区留言或者投递至我的邮箱:Mj_Ymr@outlook.com. 那么我也会不断更新,并在这里贴上各版本的下 ...
- php __DIR__ 解释下
__DIR__, php5.3 才增加的这个魔术常量,表示当前文件所在的目录地址. php5.3之前用dirname(__FILE__);表示__DIR__; __FILE__这个表示当前文件的路径.
- CentOS 通过 expect 批量远程执行脚本和命令
我们有时可能会批量去操作服务器,比如批量在服务器上上传某个文件,安装软件,执行某个命令和脚本,重启服务,重启服务器等,如果人工去一台台操作的话会特别繁琐,并浪费人力. 这时我们可以使用expect,向 ...