@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

类中的三个装饰器方法相关推荐

  1. python三层装饰器-python中自带的三个装饰器的实现

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  2. python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A():@property ...

  3. python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...

    本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...

  4. python 三个内置装饰器,python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  5. python教程:类的装饰器方法、特殊成员方法

    装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 1.静态方法 在方法名前加上@staticmethod装饰 ...

  6. Java练习题 类 先创建一个Point类,然后定义Trianglele类。在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,然后定义两个方法求三角形的周长、面积。

    先创建一个Point类,然后定义Trianglele类. 在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,再定义构造方法对这三个点进行初始化,然后定义两个方法求三角形的周长 ...

  7. python中msg函数_Python 中闭包函数和装饰器

    一.闭包函数的概述 闭包 closure, 是一种代码的组织结构.当一个内嵌函数引用其外部作用域的变量,就形成一个闭包函数.闭包函数有一个内嵌函数,内嵌函数引用外部函数中的变量,外部函数的返回值是内嵌 ...

  8. python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)

    在阅读博客中,发现了类装饰器的存在,由于之前就在写类相关的专栏,这次就赶紧补上之前的内容啦.类装饰器这个词是有歧义的,因为类本身可以作为装饰器,一个类也可以被函数装饰器所装饰.今天就简单介绍一下这两种 ...

  9. python 类方法 函数_Python OOP类中的几种函数或方法总结

    概述 实例方法 使用实例调用时,默认传递实例本身到实例方法的第一个参数self 使用类调用时,必须传递一个实例对象到实例方法的第一个参数 静态方法 使用实例调用和类调用效果相同; 类方法 装饰器版: ...

最新文章

  1. C++中标准模板库std::pair的实现
  2. 新疆乌鲁木齐3D打印智能硬件接活咯
  3. Java 并发编程—核心理论
  4. QT-Creator+SDK+编译器+自定义配置
  5. Linux脚本5秒后启动程序,嵌入式Linux启动时间优化的秘密之四-启动脚本
  6. selenium定位php,selenium之元素定位
  7. 在中国从事什么职业最赚钱_中国最好的十大职业2(转)
  8. [国家集训队]矩阵乘法 整体二分
  9. mkdir命令、chmod修改权限、利用scp 远程上传下载文件/文件夹
  10. MATLAB 内积外积混合积
  11. imazing iOS设备管理软件
  12. 无法导入某些项目,因为它们已经存在于Eclipse中的工作区错误中
  13. Gartner:细分分析如何提高销售预测的准确性?
  14. 千兆网线 双机互联交叉线
  15. 【题解】桐桐的递归函数
  16. 微软跟投,估值31.5亿美元的光量子计算公司刚刚完成4.5亿美元融资
  17. 制作大白菜装系统U盘以及重装系统
  18. 谷歌云| 5 个 GKE 功能可帮助您优化集群
  19. 泊车机器人整车控制策略
  20. matlab 做偏回归分析,偏最小二乘回归分析|MATLAB 数学统计与优化|MATLAB技术论坛 - Powered by Discuz!...

热门文章

  1. 数据爬取 mail_Python网络爬虫实战,数据解析!
  2. 智乃的树旋转(easy version)(思维+暴力)
  3. linux刻录文件,Linux命令行下刻录CD-ROM数据光盘详细过程
  4. Android6.0动态权限
  5. nvidia-rapids︱cuGraph(NetworkX-like)关系图模型
  6. Nginx Lua读取redis 进行权限认证操作
  7. ArcGIS Engine中如何获取Map中已经选择的要素呢(转)
  8. 生命科学研究需求推动云计算发展
  9. Linux守护进程的启动方法
  10. redhat6.2 下gcc安装