类中的三个装饰器方法
@classmethod
class A:__count = 0 #隐藏count属性def __init__(self,name):self.name = nameself.__add_count() #每一次实例化的时候调用私有化__count进行累加def __add_count(self): #定义一个私有化的方法A.__count +=1def show_count(self): #定义一个普通方法return A.__count #让用户可以从外部查看__count的值def eat(self):print('%s在吃饭'%self.name) wl = A('wanglan') print(wl.show_count()) wl.eat() #有的时候,在类中会有一种情况,就是这个方法并不需要使用某一个对象的属性,因此,这个方法中的self参数是一个完成无用的参数, #show_count是一个查看类中属性的方法,这样的方法和某一个对象并没有直接联系
在上面代码中,__add_count 方法和show_count方法并没有使用self参数,但是我们给它传了,正常情况下,如果参数不被使用,我们不应该传入改参数,因此这个方法中的self参数是一个完全无用的参数,我们可以直接删除,删除后的报错也只是Pycharm上的语法报错,但是python的语法不希望我们这样做,我们可以使用 @classmethod 装饰器来解决
class A:__count = 0 #隐藏count属性def __init__(self,name):self.name = nameself.__add_count() #每一次实例化的时候调用私有化__count进行累加@classmethod #被classmethod 装饰器装饰的方法,都用一个默认的参数,这个参数就是当前类def __add_count(cls): #定义一个私有化的方法print(cls,A) #两个值相同cls.__count +=1 # cls 就可以取代A @classmethoddef show_count(cls): #定义一个普通方法return cls.__count #让用户可以从外部查看__count的值def eat(self):print('%s在吃饭'%self.name) print(A.show_count()) #可以直接调用show_count wl = A('wanglan') print(wl.show_count()) wl.eat()结果: 0 <class '__main__.A'> <class '__main__.A'> 1 wanglan在吃饭
本质上:一个方法不用对象属性但是使用静态属性 -- 类方法(@classmethod)
某一个方法被创造出来,就是为了对静态变量进行操作,根部不涉及到对象,所以这个方法就应该被定义成:类方法(被@classmethod装饰),调用这个类方法时,可以使用对象调用wl.show_count(),也可以使用类调用 A.show_count(),但是这个方法的默认参数永远是当前类的命名空间,而不是对象
@staticmethod
def login(): #普通函数pass login() #调用
纯面向对象编程
class User(object):@staticmethoddef login(): #是User类中的名字 函数的名字 login就是一个类中的静态方法,本质上就是一个函数pass ret = User.login()
如果一个类中的方法不用对象属性也不用静态熟属性 -- 静态方法(@staticmethod),实际上这个方法就是一个普通的函数
小结
普通的方法 类方法 静态方法 默认参数 self cls 无 操作的变量 操作对象的属性 操作静态属性 既不操作对象属性,也不操作类的属性 所属的命名空间 类 类 类 调用方式 对象 类/对象 类/对象 对应的装饰器 无 @classmethod @staticmethod
@property:
把一个方法伪装成属性,和调用属性一样去调用方法()名称装饰,动词就不用了)
某一个属性如果是通过计算得来的,那么计算的过程写在方法里,把这个方法伪装成属性
from math import pi class Circle:def __init__(self,r):self.r = r@property # 把一个方法伪装成属性 源码中有人写,def area(self): # 被property装饰器装饰的方法不能传递除self以外的参数return pi*self.r**2@propertydef perimeter(self):return self.r*pi*2c1 = Circle(5) # print(c1.area()) #加入@property 方法前的调用 print(c1.area) #加入@property 方法后的调用 c1.r = 10 print(c1.area)
某一个属性需要被私有化,又需要能被外部查看,这种情况,把这个属性通过方法返回,方法伪装成属性
class Person:def __init__(self,name):self.__name = name # 不让外面随便修改 @propertydef name(self):return self.__namewl = Person('wanglan') print(wl.name)
修改属性值
class Person:def __init__(self,name):self.__name = name # 不让外面随便修改 @propertydef name(self):return self.__name@name.setter # 之前必须有一个同名的方法被property装饰过def name(self,new_name):if type(new_name) is str:self.__name = new_name@name.deleterdef name(self):del self.__namewl= Person('wang') print(wl.name) wl.name = 'wanglan' print(wl.name) del wl.name # 只是相当于调用被deleter装饰的方法,并不相当于删除name属性 print(wl.name)
转载于:https://www.cnblogs.com/wanglan/p/10022222.html
类中的三个装饰器方法相关推荐
- python三层装饰器-python中自带的三个装饰器的实现
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...
- python中自带的三个装饰器
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A():@property ...
- python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...
本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...
- python 三个内置装饰器,python中自带的三个装饰器
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...
- python教程:类的装饰器方法、特殊成员方法
装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 1.静态方法 在方法名前加上@staticmethod装饰 ...
- Java练习题 类 先创建一个Point类,然后定义Trianglele类。在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,然后定义两个方法求三角形的周长、面积。
先创建一个Point类,然后定义Trianglele类. 在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,再定义构造方法对这三个点进行初始化,然后定义两个方法求三角形的周长 ...
- python中msg函数_Python 中闭包函数和装饰器
一.闭包函数的概述 闭包 closure, 是一种代码的组织结构.当一个内嵌函数引用其外部作用域的变量,就形成一个闭包函数.闭包函数有一个内嵌函数,内嵌函数引用外部函数中的变量,外部函数的返回值是内嵌 ...
- python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)
在阅读博客中,发现了类装饰器的存在,由于之前就在写类相关的专栏,这次就赶紧补上之前的内容啦.类装饰器这个词是有歧义的,因为类本身可以作为装饰器,一个类也可以被函数装饰器所装饰.今天就简单介绍一下这两种 ...
- python 类方法 函数_Python OOP类中的几种函数或方法总结
概述 实例方法 使用实例调用时,默认传递实例本身到实例方法的第一个参数self 使用类调用时,必须传递一个实例对象到实例方法的第一个参数 静态方法 使用实例调用和类调用效果相同; 类方法 装饰器版: ...
最新文章
- C++中标准模板库std::pair的实现
- 新疆乌鲁木齐3D打印智能硬件接活咯
- Java 并发编程—核心理论
- QT-Creator+SDK+编译器+自定义配置
- Linux脚本5秒后启动程序,嵌入式Linux启动时间优化的秘密之四-启动脚本
- selenium定位php,selenium之元素定位
- 在中国从事什么职业最赚钱_中国最好的十大职业2(转)
- [国家集训队]矩阵乘法 整体二分
- mkdir命令、chmod修改权限、利用scp 远程上传下载文件/文件夹
- MATLAB 内积外积混合积
- imazing iOS设备管理软件
- 无法导入某些项目,因为它们已经存在于Eclipse中的工作区错误中
- Gartner:细分分析如何提高销售预测的准确性?
- 千兆网线 双机互联交叉线
- 【题解】桐桐的递归函数
- 微软跟投,估值31.5亿美元的光量子计算公司刚刚完成4.5亿美元融资
- 制作大白菜装系统U盘以及重装系统
- 谷歌云| 5 个 GKE 功能可帮助您优化集群
- 泊车机器人整车控制策略
- matlab 做偏回归分析,偏最小二乘回归分析|MATLAB 数学统计与优化|MATLAB技术论坛 - Powered by Discuz!...
热门文章
- 数据爬取 mail_Python网络爬虫实战,数据解析!
- 智乃的树旋转(easy version)(思维+暴力)
- linux刻录文件,Linux命令行下刻录CD-ROM数据光盘详细过程
- Android6.0动态权限
- nvidia-rapids︱cuGraph(NetworkX-like)关系图模型
- Nginx Lua读取redis 进行权限认证操作
- ArcGIS Engine中如何获取Map中已经选择的要素呢(转)
- 生命科学研究需求推动云计算发展
- Linux守护进程的启动方法
- redhat6.2 下gcc安装