@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. Matlab代理模式

    代理模式(Proxy)就是给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用.代理模式和装饰模式非常类似,但最主要的区别是代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行.本 ...

  2. Django:RestFramework之-------版本控制

    6.版本控制 从URL通过get传参获取版本. 6.1自定义版本控制 from rest_framework.views import APIView class ParamVersion(objec ...

  3. Vue – 基础学习(5):动态加载和注册组件

    // var myComponent =() => import(`./../../components/custom_panel/${t_url}.vue`);// //var myCompo ...

  4. 08-Vuex

    Vuex 一.简介 ① 是什么:是一个状态管理工具,存放项目组件中的公共数据 二.使用语法 ① 语法 -1. 创建 Vuex 实例 const store = new Vuex.Store({ sta ...

  5. pyppeteer进阶技巧

    记录一下在使用pyppeteer过程中慢慢发现的一些稍微高级一点的用法. 一.拦截器简单用法 拦截器作用于单个Page,即浏览器中的一个标签页.每初始化一个Page都要添加一下拦截器.拦截器实际上是 ...

  6. python工程化最佳实践

    1.pipenv 真实环境 vs virtualenv vs pipenv 2.自定义用户模型 继承BaseUserManager和AbstractBaseUser,在settings中指定AUTH_ ...

  7. 网络服务-SAMBA

    1. Samba 概述 SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内不同操作系统的计算机之间提供文件及打印机等资源的共享 ...

  8. k8s Storage Classes

    Storage Classes 介绍 StorageClass 为管理员提供了描述存储 "类" 的方法. 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由群集管理员制定的 ...

  9. 洛谷P2216 理想的正方形(单调队列)

    洛谷P2216 理想的正方形 题目链接 思路: 直接暴力显然不可行,可以发现每一个矩形向右边扩展时是一列一列增加,于是可以想到单调队列,用数组来维护当前每列的最大值.因为行也有限制,所以还要用一个单调 ...

  10. Invalid bound statement (not found): com.taotao.mapper.TbItemMapper.selectByPrimaryKey

    Invalid bound statement (not found): com.taotao.mapper.TbItemMapper.selectByPrimaryKey Invalid bound ...