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的简单运用的更多相关文章

  1. python学习之类和实例的属性;装饰器@property

    无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict ...

  2. python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property

    组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...

  3. Python 基础之面向对象之装饰器@property

    一.定义 装饰器@property可以把方法变成属性使用作用: 控制类内成员的获取 设置 删除获取 @property设置 @自定义名.setter删除 @自定义名.deleter 二.具体实现 1. ...

  4. 使用装饰器@property

    1.在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 98s.score = 1000 # 属性 ...

  5. Python 装饰器 property() 函数

    描述:property() 函数的作用是在新式类中返回属性值. @property 装饰器简单理解就是负责把一个方法变成属性调用 下面理解property()方法语法: class property( ...

  6. Python内置装饰器@property

    在<Python装饰器(Decorators )>一文中介绍了python装饰器的概念,日常写代码时有一个装饰器很常见,他就是内置的@property. 我们一步步的来接近这个概念. 一个 ...

  7. Python的私有变量与装饰器@property的用法

    Python的私有变量是在变量前面加上双横杠(例如:__test)来标识, Python私有变量只能在类内部使用,不被外部调用,且当变量被标记为私有后,调用时需再变量的前端插入类名,在类名前添加一个下 ...

  8. python装饰器--@property

    @property 考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name sel ...

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

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

随机推荐

  1. ubuntu关机和重启

    本博客旨在自我学习使用,如有任何疑问请及时联系博主 linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令 ...

  2. C# 在PDF中添加墨迹注释Ink Annotation

    PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状:该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线.下面,通过C#程序代码介绍如何 ...

  3. [LeetCode]27.移除元素(Java)

    原题地址: remove-element 题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间,你必 ...

  4. Error from server error dialing backend remote error tls internal error

    # kubectl exec -it mysql-master-8cfb64ff9-ct4dx -n prophet -- /bin/bash Error from server: error dia ...

  5. Dubbo扩展点应用之二负载均衡

    负载均衡其本质就是将请求分摊到多个操作单元上进行,从而共同完成工作任务.其策略主要用于客户端春常在多个提供者时根据算法选择某个提供者.在集群负载均衡时,Dubbo提供了多种均衡策略(包括随机.轮询.最 ...

  6. 都 2022 了,还不抓紧学 typeScript ?

    Hi,我是前端人,今日与君共勉! 本篇文章主要介绍的是什么是 typeScript ? typeScript 与 javaScript 有什么关系呢?我们为什么要学习 typeScript ? 一.什 ...

  7. 内网流量操控---pingtunnel建立icmp隧道

    一.pingtunnel工作原理 在上面的实验环境中,我们将分别在攻击机kali 2020和webserver上部署pingtunnel工具,在量太主机之间实现icmp隧道,再在kali2020上监听 ...

  8. Clickhouse 分布式表&本地表

    CK 分布式表和本地表 ck的表分为两种: 分布式表 一个逻辑上的表, 可以理解为数据库中的视图, 一般查询都查询分布式表. 分布式表引擎会将我们的查询请求路由本地表进行查询, 然后进行汇总最终返回给 ...

  9. BI系统要自研还是采购?这篇文章告诉你

    首先说一下目前市面上的BI工具都有哪些吧.总体上,其实分为免费和付费两大阵营.免费阵营里,为首的当然是GA(也就是谷歌分析).PowerBI,但是由于有墙的限制,很多公司没法使用前者.付费阵营里,近两 ...

  10. C# Semaphore 信号量 锁 简单理解

    信号量(Semaphore) Semaphore 一般译作 信号量,它也是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类.它代表了一种许可的概念,是否允许多线程对同一资源进行操作 ...