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. SpringBoot 集成Web

    1,静态资源访问: 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: ...

  2. iOS 预渲染加速图像显示

    使用 UITableView 时,发现滚动时的性能还不错,但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感. 于是猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如 ...

  3. flex布局你真的搞懂了吗?通俗简洁,小白勿入~

    flex布局 用以代替浮动的布局手段: 必须先把一个元素设置为弹性容器://display:flex: 一个元素可以同时是弹性容器和弹性元素; 设为flex布局以后,子元素的float.clear和v ...

  4. CentOS忘记mariadb/mysql root密码解决办法

    本文不再更新,可能存在内容过时的情况,实时更新请访问原地址:CentOS忘记mariadb/mysql root密码解决办法: 这里有两种方式实现修改mariadb root密码. mariadb版本 ...

  5. 「SpringBoot」如何优雅地管理SpringBoot项目

    本文主要讲述一下如何优雅地管理SpringBoot项目. 背景 课堂上,当小明形如流水地回答完沐芳老师提出来的问题时,却被至今没有对象的胖虎无情嘲讽了? 沐芳老师:小明,你平时是如何启动.停止你的Sp ...

  6. /usr/lib/jvm/java-1.8.0-openjdk/release 没有这个文件或目录

    在Java1.8以上,安装以后再安装目录是自动生成一个release文件,用于记录Java和系统信息.但是在centos中,如果你的Java是在安装系统时选择自动安装的,那么在标题那个目录下,也就是j ...

  7. 搭建mariadb数据库系统《一》

                                                                     搭建mariadb数据库系统 案例3:搭建mariadb数据库系统 3 ...

  8. Spring Boot入门系列(十)如何使用拦截器,一学就会!

    前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhon ...

  9. ORM框架对分表分库的实现

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  10. usdt钱包对接,usdt 对接交易平台,usdtapi,以太坊对接,以太坊代币对接

    usdt钱包对接,usdt 对接交易平台,usdtapi,以太坊对接,以太坊代币对接 自动充提币接口开发. 可对接:商城系统,游戏APP,交易平台,网站,各类APP -实现自动充提,查询,上链等功能接 ...