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的更多相关文章

  1. python 类内部装饰器的实现 与 参数解构学习

    学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢, 在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题class Ctj(): clas ...

  2. day28-描述符应用与类的装饰器

    #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...

  3. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  4. 11.python描述符---类的装饰器---@property

    描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...

  5. Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类

    一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...

  6. day8_类的装饰器和反射

    """ 类的装饰器: @property 当类的函数属性声明 @property后, 函数属性不需要加括号 即可调用 @staticmethod 当类的函数属性声明 @s ...

  7. Python全栈day28(类的装饰器)

    类是一个对象也可以像函数一样加装饰器 类的装饰器.py def deco(obj): print('======',obj) obj.x=1 obj.y=2 obj.z=3 return obj # ...

  8. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  9. django class类即视图类添加装饰器的几种方法

    根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 第一种:定义函数装饰器,在函数,类中使用函 ...

随机推荐

  1. spring-cloud-gateway静态路由

    为什么引入 API 网关 使用 API 网关后的优点如下: 易于监控.可以在网关收集监控数据并将其推送到外部系统进行分析. 易于认证.可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个 ...

  2. setAttribute 方法

    IE8及以下不支持 setAttribute用来修改dom标签上的属性比如(onclick); getAttribute用来获取dom标签上的属性

  3. 树莓派 zeroWH 使用笔记

    更新raspbian    apt-get update    apt-get upgrade 删除python2    sudo rm /usr/bin/python安装python3    sud ...

  4. JS获取HTML DOM元素的方法

    JS获取HTML DOM元素有八种方法: 1.根据id获取标签元素: document.getElementById("id名"); 2.根据标签名获取标签列表: document ...

  5. Python第三方包之DingDingBot

    Python第三方包之DingDingBot 这个是作者自己封装的一个钉钉机器人的包,目前只支持发文本格式.链接格式.markdown格式的消息,我们可以在很多场景用到这个,比如告警通知等 安装 pi ...

  6. C 怪兽游戏

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 何老板在玩一款怪兽游戏.游戏虽然简单,何老板仍旧乐此不疲.游戏一开始有N只怪兽,编号1到N.其中第i只怪兽 ...

  7. 新建jsp文件,The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误解决方法

    新建一个jsp文件后,有一个错误,The superclass "javax.servlet.http.HttpServlet" was not found on the Java ...

  8. linux系统部署安装过程

    1. 虚拟环境安装 1.新建虚拟机   2.虚拟机设置 2.系统历程 1.进入系统引导界面进行配置 引导项说明:            1.安装centos 系统                    ...

  9. Java反射(六)纯面向接口编程的简单框架实践

    我们知道在使用MyBatis开发时,只需要添加DAO接口和对应的映射XML文件,不需要写DAO的实现类,其实底层是通过动态代理实现. 本文将使用前几篇文章的知识点实现一个纯面向接口编程的简单框架,与M ...

  10. scratch算立方根

    10((1/3)lgx)=x(1/3)也就是立方根