# 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

最新文章

  1. 使用zabbix邮件发送报表
  2. JS基本概念 -- 数据类型(一)
  3. J2EE相关总结
  4. lua安装和简单使用
  5. ADO.Net的小知识(连接数据库)二
  6. Android ExpandableListView使用+获取SIM卡状态信息
  7. MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】
  8. 帝国cms灵动标签调用tags
  9. ios入门之c语言篇——基本函数——5——素数判断
  10. TOP命令解析
  11. 《java.util.concurrent 包源码阅读》16 一种特别的BlockingQueue:SynchronousQueue
  12. poj 3904(莫比乌斯反演)
  13. 利用Python进行数据分析——Ipython
  14. ubuntu安装qq教程
  15. 腾讯云centos服务器不能登录的解决过程
  16. oracle启动服务和监听
  17. Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
  18. 【转】在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()
  19. SSH 架构
  20. MailUtils类:用于发送激活邮件

热门文章

  1. spring boot:用dynamic-datasource-spring-boot-starter配置druid多数据源(spring boot 2.3.3)
  2. http请求需要了解的一些信息
  3. C++学习笔记---数据类型
  4. 1. Deep Q-Learning
  5. 项目 git 仓库允许服务器访问
  6. .NET CORE WebAPI JWT身份验证
  7. js内建函数reduce()
  8. JUC---03Lock(一)ReentrantLock
  9. 免费申请HTTPS通配符证书
  10. STM32入门系列-库目录及文件介绍