@classmethod

有的时候在类中会有一种情况,就是这个方法并不需要使用每一个对象属性

因此 这个方法中的self参数一个完全无用的参数,使用classmethod

class A:
__count = 0 # 隐藏类count属性 def __init__(self, name):
self.name = name
self.__add_count() # 每一次实例化的时候掉
# 用私有方法来对__count 进行累加 @classmethod
def __add_count(cls): # 定义一个私有方法
print(cls, A)
A.__count += 1 # 让这个方法只能在类的内部被使用 @classmethod
def show_count(cls): # 被classmethod 装饰去的方法,
print(cls.__count)
return A.__count # 让用户可以从外部查看__count的值 def show_count_self(self): # 定义一个普通方法
# print(self.__count)
print(self)
# print('_____')
# print(self.show_count(),'fogogo')
# return A.__count # 让用户可以从外部查看__count的值 # show_count 是一个查看类中属性的方法,这样的方法和某一个对象并没有直接联系 obj = A('baozi')
print(A._A__add_count) #
# 执行结果
<class '__main__.A'> <class '__main__.A'>
<bound method A.__add_count of <class '__main__.A'>>

本质上 :

@classmethod

一个方法不用对象属性但是使用静态属性 -- 类方法@classmethod

某一个方法被创造出来,就是为了进行对静态变量进行操作

@staticmehtod

根本不涉及到对象,所以这个方法就应该被定义成 类方法(被@classmethod装饰)

调用这个类方法,可以使用对象调用,也可以使用类调用

但是这个方法的默认参数永远是当前类的命名空间,而不是对象的

@staticmethod

如果一个类中的方法不用 对象属性 也不用 静态属性 -- 静态方法@staticmethod

那实际上这个方法就是一个普通的函数


class User(object): @staticmethod
def login(arg1, arg2):#是User类中的名字函数的名字login就是一个类中的静态方法,本质上就是一个函数
return (arg1 + arg2) def show(self):
print('---->show')
print('---self--',self.login(1, 3))
print('class--',User.login(123, 31)) print(User.login(1,2)) ## 不需要实例化,当函数使用
print(User().show()) # 执行结果 3
---->show
---self-- 4
class-- 154

一个不需要用到对象命名空间中的变量方法,就不是一个对象方法,就应该是一个普通的函数

方法的查找的顺序:

  • 是直接在自己的空间找到类 类这个方法

  • 对象先在自己的空间找,找不到,就到类的空间

classmethod staticmethod 使用场景说明:

用哪一个命名空间的名字,就定义的不同的方法
  1. self 只要用self 就是普通方法,只能用对象调

  2. Classmethod 只要cls 就是类方法,可以用类,可以用对象

  3. Staticmethod 啥用不用 就是静态方法 ,可以用,可以用对象

普通的方法 类方法 静态方法
默认参数 self cls
操作变量 操作对象属性 操作静态属性 既不操作对象属性,也不操作类的属性
所属的命名空间
调用方式 对象 类/对象 类/对象
对应的装饰器 @classmethod @staticmethod

@property

把一个方法伪装成属性,

下面例子中计算圆面积的公式


class Cirecle:
def __init__(self, r):
self.r = r @property
def area(self): # 被property 装饰器 装饰的方法不能传递 除self以外参数 return pi * self.r ** 2 def perimeter(self):
return self.r * pi * 2 c1 = Cirecle(5) print(c1.area)
# 打印执行结果 78.53981633974483

某一个属性需要被私有,但是有需要可以被外部查看, 这种情况,把这个属性通过方法,`property 伪装成属性

class Person:

    def __init__(self, name):
self.__name = name # 不让外面随便修改 @property
def get_name(self):
return self.__name ari = Person('arimiage') print(ari.get_name)
# 执行结果 arimiage

Property 修改属性值

  • @funcname.setter
  • @funcname.deleter
class Person:

    def __init__(self, name):
self.__name = name @property
def name(self):
return self.__name @name.setter # 只能传一个参数。之前必须有一个同名的方法被property装饰过
def name(self, new_name):
if isinstance(new_name, str):
# if type(new_name) is str:
self.__name = new_name
#setattr装饰的函数名叫什么
#那么这个函数中绝对不可以对这个,函数名同名属性进行修改( 函数名) @name.deleter
def name(self):
print('gogoog')
del self.__name #这里才执行删除属性操作 def get_name(self):
return self.__name # def set_name(self,new_name):
# if type(new_name) is str:
# if isinstance(new_name,str):
# self.__name == new_name ari = Person('arimiage')
{'_Person__name': 'arimiage'}
# print(Person.__dict__) print(ari.get_name) ari.name = 'fgo'
{'_Person__name': 'fgo'} #对象空间
print(Person.__dict__)
print(ari.__dict__)
print(ari.name) del ari.name # 只是相当于调用被deleter装饰的方法,并不相当于删除name属性
{} 对象空间为空 # print(ari.__dict__) # 报错

Python类中装饰器classmethod,staticmethod,property,的更多相关文章

  1. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  2. python 类的装饰器

    我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能.同理,一切皆对象,我们也可以使用装饰器为类添加类属性.what? def deco(obj): obj.x = 1 obj.y ...

  3. Python + selenium + unittest装饰器 @classmethod

    前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...

  4. python 类内部装饰器的实现 与 参数解构学习

    学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢, 在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题class Ctj(): clas ...

  5. python类常用装饰器

    class Myclass(object): def __init__(self): pass #必须实例化才能调用 def sayhi(self): print 'hello' #静态方法,跟类没什 ...

  6. day28-描述符应用与类的装饰器

    #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...

  7. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  8. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

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

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

随机推荐

  1. linux常用命令---打包压缩解压

    打包压缩解压

  2. 谈谈C#中各种线程的使用及注意项~

    说到线程,很多人会想到timer吧, 接下来我们就来学习一下 timer 吧,摇摇脑袋,清醒一下,接下来开始学习.... 一.基本概念 1.什么是进程?        当一个程序开始运行时,它就是一个 ...

  3. poj2226更改行列匹配建图

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10961   Accepted: 4071 Des ...

  4. Web Scraper——轻量数据爬取利器

    日常学习工作中,我们多多少少都会遇到一些数据爬取的需求,比如说写论文时要收集相关课题下的论文列表,运营活动时收集用户评价,竞品分析时收集友商数据. 当我们着手准备收集数据时,面对低效的复制黏贴工作,一 ...

  5. 405 - 不允许用于访问此页的 HTTP 谓词的处理办法

    今天介绍的是针对访问html页面时出现此类错误的处理办法,如果你的问题页面是其他类型,可以参考如下信息: IIS 返回 405 - 不允许用于访问此页的 HTTP 谓词.终极解决办法!!!! 1.为什 ...

  6. Verilog代码和FPGA硬件的映射关系(三)

    组合逻辑和FPGA之间的映射关系我们知道了,那时序逻辑和FPGA之间又是一种怎样的映射关系呢?我们就以前面寄存器章节的例子来向大家说明,也一同把当时为什么用异步复位更节约资源的原因告诉大家.我们先来看 ...

  7. Linux下VCS2014和Verdi2015的联合使用

    VCS和Verdi是IC设计中常用的两款开发工具.VCS是Synopsys公司的产品,和大家所熟知的ModeSim一样的都是EDA仿真工具.Verdi是Nocas公司(已经被Synopsys公司收购) ...

  8. 使用OS模块来获取文件路径

    1.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的. 2.常用方法 os.getcwd() 函数得到当前工作目录,即当前Pyth ...

  9. Elasticsearch如何有惊无险地入门,我是用心的

    学习真的是一件令人开心的事情,上次分享了 Redis 入门的文章后,收到了很多小伙伴的鼓励,比如说:"哎呀,不错呀,二哥,通俗易懂,十分钟真的入门了".瞅瞅,瞅瞅,我决定再接再厉, ...

  10. Python编程基本规范

    1.命名规范 类:类的名称一般为名词,且以驼峰形式(即每个单词首字母要大写,其余字母小写,单词之间无间隔符号)给出. 函数:一般以动词开头,函数名称要准确.简要地概括本函数的作用.函数名一律小写,如有 ...