装饰器property的简单运用
property函数:在类中使用,将类中的方法伪装成一个属性
使用方法:在函数,方法,类的上面一行直接@装饰器的名字
装饰器的分类:
装饰器函数
装饰器方法:property
装饰类
class Student:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter #设置,修改(自我理解)
def name(self,new_name):
if type(new_name) is str: #只有当修改的值为str类型,才能被修改
self.__name = new_name
a1 = Student("诸葛")
print(a1.name) #诸葛
a1.name = "睿智"
print(a1.name) #睿智
a1.name = 123
print(a1.name) #睿智
setter的用法:
setter是只有被property方法之后的,又实现了一个同名的方法,且被setter装饰器装饰了
它的作用是用来保护一个变量,在修改的时候能够添加一些保护条件。
deleter的用法:
一个方法被伪装成属性后,应该可以执行一个属性的增删改查操作,
所以deleter就是对应着被deleter装饰的方法,这个方法并不是只为了删除这个属性,而是你在代码中执行什么就有什么效果。
class Goods:
__discount = 0.8
def __init__(self,price):
self.__price = price
@property
def price(self):
return self.__price * self.__discount
@price.setter
def price(self,new):
if type(new) is int:
self.__price = new
@price.deleter
def price(self):
del self.__price
apple = Goods(10)
print(apple.price) #8.0
print(apple.__dict__) #{'_Goods__price': 10}
apple.price = 20 #将__price的值进行修改
print(apple.price) #16
print(apple.__dict__) #{'_Goods__price': 20}
del apple.price #删除
print(apple.__dict__) #{}
deleter通常用在
class A:
def __init__(self):
self.__f = open('aaa','w') @property
def f(self):
return self.__f @f.deleter
def f(self):
self.__f.close() #先关闭文件
del self.__f #删除文件
@classmethod 将类中的方法变成类方法,为了不创建类对象,而直接用类方法修改静态私有属性。用法如下
只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法在方法上面@classmethod将这个方法变成类方法
class Goods:
__discount = 0.8 #静态私有属性
def __init__(self,price):
self.__price = price #私有对象属性
self.name = "apple" #对象属性
@property
def price(self):
return self.__price *Goods.__discount @classmethod #类方法
def change_disount(cls,new): #cls 表示Goods这个类
cls.__discount = new #对Goods中的静态私有属性进行修改
print(Goods.__dict__) # '_Goods__discount': 0.8,
Goods.change_disount(0.7)
print(Goods.__dict__) #'_Goods__discount': 0.7,
@staticmethod 静态方法 (如果函数要在类中使用,就用静态方法)
class Student: @staticmethod #在类中创建函数
def login(usr,pwd):
print('IN LOGIN',usr,pwd) Student.login('user','pwd')
总结
# 类:
# 静态属性 类 所有的对象都统一拥有的属性
# 类方法 类 如果这个方法涉及到操作静态属性、类方法、静态方法 cls 表示类
# 静态方法 类 普通方法,不使用类中的命名空间也不使用对象的命名空间 : 一个普通的函数 没有默认参数
# 方法 对象 self 表示对象
# property方法 对象 slef 表示对象
isinstance(a,A) 判断对象与类直接的关系
issubclass(A,B) 判断类与类之间的关系
class A:pass
class B(A):pass
a = A()
b = B()
# print(type(a) is A) #True
# print(type(b) is B) #True
# print(type(b) is A) #False # print(isinstance(a,A)) #True #isinstance判断对象a与类A的关系(自我理解)
# print(isinstance(b,A)) #True
# print(isinstance(a,B)) #False
print(issubclass(B,A)) #True
print(issubclass(A,B)) #False 判断类与类之间的关系
装饰器property的简单运用的更多相关文章
- python学习之类和实例的属性;装饰器@property
无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict ...
- python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property
组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...
- Python 基础之面向对象之装饰器@property
一.定义 装饰器@property可以把方法变成属性使用作用: 控制类内成员的获取 设置 删除获取 @property设置 @自定义名.setter删除 @自定义名.deleter 二.具体实现 1. ...
- 使用装饰器@property
1.在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 98s.score = 1000 # 属性 ...
- Python 装饰器 property() 函数
描述:property() 函数的作用是在新式类中返回属性值. @property 装饰器简单理解就是负责把一个方法变成属性调用 下面理解property()方法语法: class property( ...
- Python内置装饰器@property
在<Python装饰器(Decorators )>一文中介绍了python装饰器的概念,日常写代码时有一个装饰器很常见,他就是内置的@property. 我们一步步的来接近这个概念. 一个 ...
- Python的私有变量与装饰器@property的用法
Python的私有变量是在变量前面加上双横杠(例如:__test)来标识, Python私有变量只能在类内部使用,不被外部调用,且当变量被标记为私有后,调用时需再变量的前端插入类名,在类名前添加一个下 ...
- python装饰器--@property
@property 考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name sel ...
- 11.python描述符---类的装饰器---@property
描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...
随机推荐
- 介绍回流与重绘(Reflow & Repaint),以及如何进行优化?
前言 回流与重绘对于前端来说可以说是非常重要的知识点了,我们不仅需要知道什么是回流与重绘,还需要知道如何进行优化.一个页面从加载到完成,首先是构建DOM树,然后根据DOM节点的几何属性形成render ...
- 加密模块hashlib+日志模块logging
目录 1.hashlib 加密模块 1.hashlib模块基本使用 1.2 详细操作 ①md5加密模式 ②sha256复杂加密模式 ③加盐操作(普通加盐) ④加盐操作(动态加盐) 2.logging ...
- 【ybtoj】二分算法例题
[基础算法]第三章 二分算法 例一 数列分段 题目描述 对于给定的一个长度为N的正整数数列A,现在将其分成M段,并要求每段连续,且每段和的最大值最小. 输入格式 第1行包含两个正整数N,M. 第2行包 ...
- suse 12 升级 OpenSSH-7.2p2 到 OpenSSH-8.4p1
文章目录 1.查看当前当前环境信息 1.1.查看openssh当前版本 1.2.查看当前linux发行版 2.部署telnet-server 2.1.下载telnet-server 2.2.配置tel ...
- mac 调出任何来源方法
如果没有这个选项的话(macOS Sierra 10.12),打开终端,执行sudo spctl --master-disable即可 这可以很好的解决掉 部分软件 显示已损坏的办法
- RadonDB MySQL on K8s 2.1.2 发布!
RadonDB MySQL on Kubernetes 于 2 月 17 日发布了新版本 2.1.2 .该版本在节点的重建.增删等方面进行了全面升级. 致谢: 首先感谢 @andyli029 @ace ...
- Django整体模型理解(1)
Django大概理解 *models: 设计一个模型,即在数据库中设计一个表,一个模型就是对应一个数据库中的表:models是一个类,类名就是表名,而类的属性就是表的字段.如下例子设计了两个表: f ...
- windows server2012 r2 .net framework 3.5失败
拿到手的虚拟机系统是Windows server 2012R2,本想着安装SQlserver2012轻轻松松,结果途中警告未安装.NET Framework 3.5.于是找了个.NET Framewo ...
- csaw密码
题目:AAoHAR1TIiIkUFUjUFQgVyInVSVQJVFRUSNRX1YgXiJSVyJQVRs=写python脚本: import base64 ciphertext="AAo ...
- kali linux清理垃圾
sudo apt-get autoclean # 清理旧版本的软件缓存 sudo apt-get clean # 清理所有软件缓 ...