# property
# 内置装饰器函数 只在面向对象中使用
# 装饰后效果:将类的方法伪装成属性
# 被property装饰后的方法,不能带除了self外的任何参数 from math import pi
class Circle:
def __init__(self, r):
self.r = r
def perimeter(self):
return 2 * pi * self.r
def area(self):
return pi * self.r**2 * pi c1 = Circle(5) # 上面的例子是求一个圆的面积和周长,然而圆的周长和面积其实应该是圆的一个属性,但上面的圆类中没有面积和周长的属性
# 所以我们只能调用元的面积方法然后得到面积值
print(c1.area())
# 但我们可以通过property装饰器将类方法进行装饰,这样调用类方法时,看起来就像是直接调用了属性来得到值,调用方法时方法不用加()
class Circle:
def __init__(self, r):
self.r = r
@property
def perimeter(self):
return 2 * pi * self.r
@property
def area(self):
return pi * self.r**2 * pi
c1 = Circle(5)
print(c1.area) # 246.74011002723395 像直接调用属性一样
print(c1.perimeter) # 31.41592653589793 像直接调用属性一样 # ------------------------------------------------------------------
class Persion:
def __init__(self, name):
self.__name = name @property
def name(self):
return self.__name + 'sb' tiger = Persion('haha')
print(tiger.name)
#tiger.name = 'dede'
# 上面的例子中,我们将name方法伪装成了一个属性,所以我们可以直接像访问属性一样来调用这个方法
# 但是,name虽然被property伪装成了属性,但是却无法tiger.name = 'dede'去修改这个name,看样子伪装为属性的感觉
# 还差一点,因为公有属性是可以被修改的,所以使用下面的方法就可以将被property修饰的方法弄成可以修改的操作
class Persion:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name + 'sb'
@name.setter # name是被property装饰的name,目的是让name可以作为左值,name.setter后,就可以定义一个修改name的方法了,只能接收一个参数,用来作为等号的右值
def name(self, newName):
self.__name = newName tiger = Persion('haha')
print(tiger.name)
tiger.name = 'dede'
print(tiger.name) # property的应用实例, 超市的水果突然开始打5折
class Goods:
discount = 0.5
def __init__(self, name, price):
self.name = name
self.__price = price
@property
def price(self):
return self.__price * Goods.discount apple = Goods('苹果', 5)
print(apple.price) # 2.5 # --------------------------------------------------------------------
# 删除类的属性和修改类的属性
class Persion:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.deleter # 用这个东西装饰后,del p.name后这个被装饰的方法就会被调用
def name(self):
del self.__name # 删除属性
@name.setter # name.setter后,当name作为左值时,改被装饰的方法被调用,右值作为参数传入到newName
def name(self, newName):
self.__name = newName p = Persion('wer')
print(p.name) # wer
del p.name # 删除了Persion中的__name属性
# print(p.name) # classmethod
# staticmethod

property内置装饰器函数和@name.setter、@name.deleter的更多相关文章

  1. classmethod、staticclassmethod内置装饰器函数

    # method 英文是方法的意思 # classmethod 类方法 # 当一个类中的方法中只涉及操作类的静态属性时,此时在逻辑上,我们想要直接通过类名就可以调用这个方法去修改类的静态属性,此时可以 ...

  2. 面向对象——组合、封装、访问限制机制、property内置装饰器

    面向对象--组合.封装.访问限制机制.property 组合 什么是组合? 组合指的是一个对象中,包含另一个或多个对象 为什么要组合? 减少代码的冗余 怎么用组合? # 综合实现 # 父类 class ...

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

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

  4. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  5. python内置装饰器

    前言 接着上一篇笔记,我们来看看内置装饰器property.staticmethod.classmethod 一.property装饰器 1. 普通方式修改属性值 code class Celsius ...

  6. Python 内置装饰器

    内置的装饰器 ​ 内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些. @property ​ 在了解这个装饰器前,你需要知道在不使用装饰器怎么写一个属性. d ...

  7. python基础--定义装饰器(内置装饰器)

    装饰器的定义: 装饰器本质上就是一个python函数,它可以让其它函数在不需要做任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景中,比如-- >插入 ...

  8. Python内置装饰器@property

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

  9. 内置装饰器二:@property

    property 装饰器的作用 property 装饰器将方法包装成属性,将私有属性公有化,此属性只能被读取.相当于实现get方法的对象 class People: def __init__(self ...

随机推荐

  1. ansible使用setup模块查看受控机的信息(ansible2.9.5)

    一,ansible的setup模块的用途: 用来获取主机的信息 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest 对应的 ...

  2. centos8平台编译安装nginx1.18.0

    一,nginx的官网: http://nginx.org/ 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest 对应的源码 ...

  3. C#中的SqlBulkCopy批量插入数据

    在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// < ...

  4. spring-boot-route(二十)Spring Task实现简单定时任务

    Spring Task是Spring 3.0自带的定时任务,可以将它看作成一个轻量级的Quartz,功能虽然没有Quartz那样强大,但是使用起来非常简单,无需增加额外的依赖,可直接上手使用. 一 如 ...

  5. Netty关闭连接流程分析

    在实际场景中,使用Netty4来实现RPC框架,服务端一般会验证协议,最简单的方法的协议探测,判断魔数是否正确.如果服务端无法识别协议会立即抛出异常,并主动关闭连接,此时客户端会收到read信号,在发 ...

  6. Java安全之安全加密算法

    Java安全之安全加密算法 0x00 前言 本篇文来谈谈关于常见的一些加密算法,其实在此之前,对算法的了解并不是太多.了解的层次只是基于加密算法的一些应用上.也来浅谈一下加密算法在安全领域中的作用.写 ...

  7. Luogu P4280 [AHOI2008]逆序对

    题目描述 甩个链接就走 题解 先预处理出每个位置上分别填上 1~k 的数的逆序对的数量的前缀和与后缀和 (不用管原来有值的,统计时不计入答案就行了) (有点绕,看代码应该能懂) 然后枚举每个 -1 的 ...

  8. 给Swagger换一套皮肤 Knife4j集成记录

    Swagger有一套经典的UI,但是并不是很好用,之前有看到Knife4j,界面没管.功能完善,因此尝试集成. demo参考示例地址:knife4j-spring-boot-demo Knife4j前 ...

  9. frida打印与参数构造

    title: frida打印与参数构造 categories: 逆向与协议分析 toc: true mathjax: true tags: frida HOOK 逆向 widgets: type: t ...

  10. python开发初识(一)

    python开发 机器码和字节码 机器码 :计算机可以直接认识的语言 字节码 :高级语言转换成机器码去执行 语言之间的对比: C,汇编 :C语言是根语言 python Java :既能写前端,又能写后 ...