博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
property内置装饰器函数和@name.setter、@name.deleter
阅读量:6611 次
发布时间:2019-06-24

本文共 2455 字,大约阅读时间需要 8 分钟。

# property    # 内置装饰器函数 只在面向对象中使用    # 装饰后效果:将类的方法伪装成属性    # 被property装饰后的方法,不能带除了self外的任何参数from math import piclass Circle:    def __init__(self, r):        self.r = r    def perimeter(self):        return 2 * pi * self.r    def area(self):        return pi * self.r**2 * pic1 = 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 * pic1 = 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 = newNametiger = 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.discountapple = 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 = newNamep = Persion('wer')print(p.name)   # werdel p.name  # 删除了Persion中的__name属性# print(p.name)# classmethod# staticmethod

 

转载于:https://www.cnblogs.com/whylinux/p/9739398.html

你可能感兴趣的文章
C/S与B/S架构比较
查看>>
XML学习总结(2)——XML简单介绍
查看>>
python操作数据库-安装
查看>>
vs.net删除转移文件
查看>>
你真的了解interface和内部类么
查看>>
java中常用的类型转换
查看>>
【log4j】使用Log4j?,slf4j更轻巧高效
查看>>
第三章 创建命令
查看>>
kuangbin专题七 POJ3264 Balanced Lineup (线段树最大最小)
查看>>
JS动画效果链接汇总
查看>>
父类转为子类涉及到的安全问题
查看>>
网络流,流水线模拟
查看>>
知识点笔记
查看>>
陈云川的OPENLDAP系列
查看>>
django 模型-----自连接
查看>>
P1197 [JSOI2008]星球大战
查看>>
urllib模块
查看>>
XML转义字符
查看>>
微信小程序之简单记账本开发记录(六)
查看>>
死锁和活锁
查看>>