@property

先看实例:

 from math import pi
class Circle:
def __init__(self,r):
self.r = r
@property
def perimeter(self):
return 2*pi*self.r
@property
def area(self):
return self.r**2*pi # c1 = Circle(5)
# print(c1.area) # 圆的面积
# print(c1.perimeter) # 圆的周长

上边求圆的周长和圆的面积的类中,圆的周长和面积本来应该是属性,可是在一般的求解中,我们却要使用实例.方法名()的形式来求出结果,显然与真实世界对于属性的定义有些矛盾。现在可以通过在方法前@property,将此其伪装成一个属性,这样我们可以通过

实例.方法来调用,效果与实例.方法名() 是一样的。

在看下边这个实例:

class Person:
def __init__(self,name):
self.__name = name @property
def name(self):
return self.__name @name.deleter
def name(self):
del self.__name @name.setter
def name(self,new_name):
self.__name = new_name

类中的方法名本来是不能用相同名字的,但只要使用@property加在someone之前,并且在再此定义此someone前,@someone.setter,@someone.deleter。这样在类实例化化后,调用对象.someone就相当于调用@property下的someone方法。

调用对象.someone=sthing就相当于调用@someone.setter下的方法,并且传进去一个参数sthing。调用del.对象.someone相当于调用@someone.deleter下的方法。

说到@property就要提到property这个函数 请看例子:

 class C(object):
def __init__(self):
self._x = None def getx(self):
return self._x def setx(self, value):
self._x = value def delx(self):
del self._x x = property(getx, setx, delx, "I'm the 'x' property.")

以下是 property() 方法的语法:

classproperty([fget[, fset[, fdel[, doc]]]])
  • fget -- 获取属性值的函数
  • fset -- 设置属性值的函数
  • fdel -- 删除属性值函数
  • doc -- 属性描述信息

返回新式类属性,效果与@property相同。

@classmethod

@classmethod   # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象。

当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法。

class someone:
__sthing = "abc" #定义一个类的私有属性 @classmethod # 把一个方法 变成一个类中的方法
def change_sthing(cls,new_sthing): # 修改属性
cls.__sthing = new_sthing

类似于实例方法要传个self代表实例对象,此类方法在传参时,要传一个形参代表当前类,默认cls。

@staticmathod

在完全面向对象的程序中,

如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法

class Login:
def __init__(self,name,password):
self.name = name
self.pwd = password
def login(self):pass @staticmethod
def get_usr_pwd(): # 静态方法
usr = input('用户名 :')
pwd = input('密码 :')
Login(usr,pwd)

静态方法就是一个写在类里的普通函数。

对象可以调用类方法和静态方法

一般情况下 推荐用类名调用

类方法 有一个默认参数 cls 代表这个类  cls

静态方法 没有默认的参数 就象函数一样

通过类.静态方法调用时不会实例化。

classC(object):
def__init__(self):
self._x = Nonedefgetx(self):
returnself._xdefsetx(self, value):
self._x = valuedefdelx(self):
delself._xx = property(getx, setx, delx, "I'm the 'x' property.")

三个面向对象相关的装饰器@property@staticmathod@classmethod的更多相关文章

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

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

  2. python学习之类和实例的属性;装饰器@property

    无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict ...

  3. python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property

    组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...

  4. Python 基础之面向对象之装饰器@property

    一.定义 装饰器@property可以把方法变成属性使用作用: 控制类内成员的获取 设置 删除获取 @property设置 @自定义名.setter删除 @自定义名.deleter 二.具体实现 1. ...

  5. 初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)

    封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# ...

  6. python 描述符 上下文管理协议 类装饰器 property metaclass

    1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分py ...

  7. Flask10 登录模块、表单框架、表单渲染、表单验证、bookie、请求之前钩子、g对象、编写装饰器

    from flask import Flask from flask import request from flask import render_template from flask_wtf i ...

  8. 装饰器property的简单运用

    property函数:在类中使用,将类中的方法伪装成一个属性 使用方法:在函数,方法,类的上面一行直接@装饰器的名字 装饰器的分类: 装饰器函数 装饰器方法:property 装饰类 class St ...

  9. python装饰器--@property

    @property 考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name sel ...

随机推荐

  1. 《SAP微顾问和大数据 》公众号管理课程清单

    互联网商业模式创新 电子商务与传统企业转型 “一带一路”信息化:格局与对策 “一带一路”沿线国家主权信用及风险防范 大数据下的资源整合和知识共享 地产数字化改革的痛点与处方 携手共建“一带一路” 数字 ...

  2. Matlab解释器模式

    解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式.其模式结构如下图.本文使 ...

  3. CORS-跨域资源共享 解决跨域问题

    1.什么是跨域? a.test.com 和 b.test.com 是两个不同的域,而处于安全机制考虑,JS只能访问与所在页面同一个域(相同协议.域名.端口)的内容,但是我们在项目开发时,经常遇到一个页 ...

  4. xenserver 备份和还原

    1. 备份和还原xenserver host系统 //备份 # xe host-backup file-name=[name.xbk] -s [ip] -u [username] -pw [passw ...

  5. 12306 抢票项目霸榜 GitHub,标星即将破万

    十一将至,你买到回家的火车票了吗?如果没有,你可以试着打开 GitHub,在搜索栏键入 12306 的关键词,我相信你会发现一个新大陆.没错,这里有 1572 个抢票项目.它们大多用 Python.J ...

  6. BLAS快速入门

    一.简介 BLAS[Basic Linear Algebra Subprograms,基础线性代数程序集]是一个应用程序接口[API]标准,用于规范发布基础基础线性代数操作的数值库[常用于向量或矩阵计 ...

  7. Golang: 接收GET和POST参数

    GET 和 POST 是我们最常用的两种请求方式,今天结合前端 axios 请求库来讲一讲,如何在 golang 服务中,正确接收这两种请求的参数信息. 一.搭建一个简单的服务 首先,我们来创建一个最 ...

  8. Ubuntu不能使用passwd的--stdin的解决办法

    转载请注明来源https://www.cnblogs.com/sogeisetsu/p/11397648.html Ubuntu不能使用passwd的--stdin的解决办法 可以使用chpasswd ...

  9. httprunner学习15-运行用例命令行参数详解

    前言 HttpRunner 在命令行中启动测试时,通过指定参数,可实现丰富的测试特性控制. 命令行参数CLI 使用 -h 查看相关命令行参数 hrun -h 参数名称 参数值 参数说明 -h, --h ...

  10. httprunner学习10-测试报告ExtentReport

    前言 httprunner默认生成的报告不怎么美观,里面还有第二套报告模板extent_report_template.html. extent_report_template 使用 hrun -h ...