Python类中装饰器classmethod,staticmethod,property,
@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 使用场景说明:
用哪一个命名空间的名字,就定义的不同的方法
self只要用self就是普通方法,只能用对象调Classmethod只要cls 就是类方法,可以用类,可以用对象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,的更多相关文章
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- python 类的装饰器
我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能.同理,一切皆对象,我们也可以使用装饰器为类添加类属性.what? def deco(obj): obj.x = 1 obj.y ...
- Python + selenium + unittest装饰器 @classmethod
前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...
- python 类内部装饰器的实现 与 参数解构学习
学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢, 在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题class Ctj(): clas ...
- python类常用装饰器
class Myclass(object): def __init__(self): pass #必须实例化才能调用 def sayhi(self): print 'hello' #静态方法,跟类没什 ...
- day28-描述符应用与类的装饰器
#!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...
- 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
- 11.python描述符---类的装饰器---@property
描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...
随机推荐
- iterm 分屏切换快捷键与配色设置
(1)快捷键设置 ⌘ + d: 垂直分屏, ⌘ + shift + d: 水平分屏. ⌘ + ]和⌘ + [在最近使用的分屏直接切换. ⌘ + opt + 方向键切换到指定位置的分屏. ⌘ + 数字: ...
- .Net数据集导出到Excel样式细节---------------摘自别人的
.Net数据集导出到Excel样式细节 本文的目的是总结一些在做Excel导出功能时需要注意的样式细节.使用环境是Asp.Net,数据集的形式是Html Table,Excel还是识别一些CSS代码的 ...
- Java——反射三种方式的效率对比
转载自:https://blog.csdn.net/aitcax/article/details/52694423 1 使用field(效率最高) long start = S ...
- TCP实现连接传输案例
使用的类 ServerSocket 服务器端 构造方法:ServerSocket(端口号); 接收端使用 方法:accept(); 返回一个 Socket对象 getI ...
- 机器人操作系统——ROS,Robot Operating System
Note:偶然看到的滴滴研究院的无人驾驶竞赛,了解一下. ROS:专为机器人软件开发所设计出来的一套电脑操作系统架构.是一个开源的元级操作系统(后操作系统),提供类似操作系统的服务,包括硬件抽象描述. ...
- [PHP动态]0001.关于 PHP 7 你必须知道的五件事
1.今年的计划表已出.PHP 7 时间表 RFC 投票一直通过, PHP 7 将在2015年10月发布.尽管有些延迟,但我们还是很高兴它在今年内发布.PHP 7 详细时间表由此查看. 2.PHP 要上 ...
- while与do-while循环的使用
/* 1.格式: ①初始化条件 while(②循环条件){ ④循环体 ③迭代条件 } 2.for循环与while可以相互转换的 . */ public class TestWhile { //100以 ...
- Alpha冲刺 —— 5.1
这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...
- Rocket - jtag - JtagShifter
https://mp.weixin.qq.com/s/pHtrlmSCPqzlDdfj3qkNPQ 简单介绍JtagShifter的实现. 1. 简单介绍 实现移位寄存器链,包含并行Capture和U ...
- Rocket - tilelink - Broadcast
https://mp.weixin.qq.com/s/-pjCLzzincJz0Z66orx8kg 介绍Broadcast的实现. 1. 基本介绍 TLBroadcast实现的是 ...