1、property

  用途:用来将对像的某个方法伪装成属性来提高代码的统一性。

class Goods:                #商品类
discount = 0.8            #商品折扣
def __init__(self,name,price):
self.name = name
self.price = price
def discountprice(self):      #定义goodsprice方法,返回折扣后价格
return self.price*self.discount
ipad = Goods('ipad',2299)    #实例化商品
print(ipad.name)
print(ipad.discountprice())  #打印商品的的折扣价格
      

  实时上商品的折扣价格应该跟商品的名字一样更像一个对象的属性应该是按照:对象.属性去访问而不是对象.方法()访问,因为抵扣价格更像是商品的属性。而property就可以将方法伪装成对象的属性:

class Goods:
discount = 0.8
def __init__(self,name,price):
self.name = name
self.price = price
@property    #在要装饰的方法前面加上@property,注意装饰的方法是除了self不能接受参数的
def discountprice(self):
return self.price*self.discount ipad = Goods('ipad',2299) print(ipad.name) print(ipad.discountprice)  #可以直接用访问属性的方法得到折扣价。
                 #这样我们就实现了对象访问的一致性。

  既然伪装成了一个属性,那么属性不仅可以访问应该还可以修改和删除,但是你发现你如果调用ipad.discountprice=1000,会执行错误,因为他本身还是个函数,只是被装饰器伪装了所以这里引入property的另外两个方法setter和deleter:      

class Goods:
discount = 0.8
def __init__(self,name,price):
self.name = name
self.price = price
@property
def discountprice(self):
return self.price*self.discount
@discountprice.setter      #装饰函数发送修改的值,必须有一个参数
def discountprice(self,new):
self.price = new
@discountprice.deleter
def discountprice(self):    #装饰函数删除属性
del self.price ipad = Goods('ipad',2299)
print(ipad.price) #
print(ipad.discountprice) #1839.2
ipad.discountprice = 3000    #执行被@discountprice.setter装饰的函数new接受3000
print(ipad.discountprice) # del ipad.discountprice    #删除属性 执行被@discountprice.deleter装饰的函数
print(ipad.discountprice) #报错没有discountprice

#以上就完全将discounsprice伪装成了属性,可以按照属性的查删改去调用discountprice,注意被property、setter、deleter装饰的函数一定要同名

# 一个方法被伪装成属性之后
# 应该可以执行一个属性的增删改查操作
# 那么增加和修改 就对应这被setter装饰的方法 :这个方法又一个必传的参数new,表示赋值的时候等号后面的值
# 删除一个属性 对应着 被deleter装饰的方法,这个方法并不能在执行的时候真的删除这个属性,而是你在代码中执行什么就有什么效果


#classmethod
# 在类中定义一个类方法 、是一个装饰器
# 什么时候用?
# 如果你的整个方法中都没有用到对象命名空间中的名字,且你用到了类的命名空间中的名字(普通方法和property方法除外)
# 类方法的默认参数 : cls 值得是调用这个方法的类
# 类方法的调用方式 : 通过类名调用,本质是方法

 

2、classmethod

  故名思议,类方法装饰器,当执行的方法操作的只有类的静态属性时,这个方法应该是用类本身去调用而不是实例的对象,还是上面的例子我要你用去定义个方法更改类的disount的值你会写出下面的代码

class Goods:
__discount = 0.8 # 静态属性
def __init__(self,price):
self.__price = price # 对象属性
self.name = 'apple' def price(self): return self.__price * Goods.__discount def change_discount(self,new): #方法在对象调用时,函数内部并没有引用对象任何属性
Goods.__discount = new
ipad = Goods('ipad',2000)
ipad.chang_discount(0.7)    #这样你虽然实现了更改了类的静态属性,但这在编程上是不规范的:对象通过方法修改类属性,在方法内部没有引用任何对象的属性,
                  #那么把对象调用就多余了,还有类的属性应该由类本身去修改 #修改如下:
class Goods:
__discount = 0.8 # 静态属性
def __init__(self,price):
self.__price = price # 对象属性
self.name = 'apple' def price(self): return self.__price * Goods.__discount
@classmethod
def change_discount(clf,new): # 类方法,这样这里的clf就如同对象调用方法自动将对象传入self一样会自动将类自己传入
clf.__discount = new
Goods.change_discount(0.7)  #这样就是类自己调用类方法修改自己的属性,而且只需要输入new的参数即可,crf会自动接收类本身

3、staticmethod

  静态方法,就是通常我们定义的函数,内部既不会引用对象方法属性也不会引用类属性和方法,但是需要你将他放在类里面,这样只是为了纯面向对象编程,外部无函数:

 class Foo:     @classmethod     def class_method(cls):pass     @staticmethod     def static_method():pass
Foo.static()      #通过类调用函数,传参和函数还是一致

# staticmethod
# 将一个普通的函数放到类中来就给这个函数加上一个@staticmethod装饰器
# 这个函数就不需要传默认的参数:self,cls
# 静态方法的调用方式 : 通过类名调用,本质还是函数

 

python面对对象编程中会用到的装饰器的更多相关文章

  1. python面对对象编程----2:__init__

    面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...

  2. python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法

    一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...

  3. python面对对象编程----------7:callable(类调用)与context(上下文)

    一:callables callables使类实例能够像函数一样被调用 如果类需要一个函数型接口这时用callable,最好继承自abc.Callable,这样有些检查机制并且一看就知道此类的目的是c ...

  4. Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数

    Python 函数式编程 2 返回函数 返回函数的意思就是:函数作为返回值.(高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.) 举个例子:实现一个可变参数的求和. 正常的函数: de ...

  5. python面对对象编程---------6:抽象基类

    抽象基本类的几大特点: 1:要定义但是并不完整的实现所有方法 2:基本的意思是作为父类 3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白 用抽象基本类的地方: 1:用作父类 2:用作检 ...

  6. python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor

    一:最基本的属性操作 class Generic: pass g= Generic() >>> g.attribute= "value" #创建属性并赋值 > ...

  7. python面对对象编程------3:写集合类的三种方法

    写一个集合类的三种方法:wrap,extend,invent 一:包装一个集合类 class Deck: def __init__( self ): self._cards = [card6(r+1, ...

  8. python面对对象编程----1:BlackJack(21点)

    昨天读完了<Mastering Object-oriented Python>的第一部分,做一些总结. 首先,第一部分总过八章,名字叫Pythonic Classes via Specia ...

  9. Python学习6——再谈抽象(面对对象编程)

    1.对象魔法 在面对对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法. 使用对象而非全局变量以及函数的原因有多个,而最重要的好处不过以下几点: 多态:可对不同类型的对象 ...

随机推荐

  1. Android学习之基础知识七—碎片的最佳实践

    一.Android碎片(Fragment)的最佳实践——简易版新闻应用 第一步:新建FragmentBestPractice项目,在app/build.gradle当中添加:RecyclerView ...

  2. MySQL(十二)游标和触发器

    一.游标 定义:存储在MySQL服务器上的数据库查询,是一种被select语句检索出来的结果集. 作用:方便在检索出来的结果集中前进或后退一行或多行. 游标主要用于交互式应用:MySQL中的游标只能用 ...

  3. 2-关于单片机通信数据传输(中断接收,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    上一篇链接 http://www.cnblogs.com/yangfengwu/p/8628219.html 先说明一点这种方式,不光对于单片机类的,,对于上位机接收数据同样适用----不骗人的,自己 ...

  4. Java:内省(Introspector)

    内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且 ...

  5. [Synthetic-data-with-text-and-image]

    0 引言 本文是之前为了解决如何将文字贴到图片上而编写的代码,默认是如发票一类的,所以并未考虑透视变换等.且采用的是pygame粘贴方式,之前也尝试过opencv的seamlessClone粘贴. 值 ...

  6. (转)Ubuntu init启动流程分析

    原文 upstart homepage 现行的Linux distros主流的有两种init方式:一种是广为流传的System V initialization,它来源于Unix并且至今仍被各种Lin ...

  7. Ionic下的Jpush消息推送与内容显示

    本文测试Jpush将消息推送给手机端,手机端点击通知栏,即可看到具体的推送内容. 1.极光推送消息设置 设置附加字段: 点击发送,手机端收到消息通知. 2.手机接收到的消息通知 点击之后进入具体的页面 ...

  8. 基于Angular+WebAPI+OData的增删改查

    对于在ASP.NET WebAPI中怎么使用OData,已经在我前面的日志中的说明, 在ASP.NET Web API中使用OData 在这个示例中.我新建了一个Order的实体,在前端使用Angul ...

  9. vs2017+opencv4.0.1安装配置详解(win10)

    一.说明 笔者之前已经安装过了vs2017,对应的opencv是3.4.0版本的.但现在想体验下opencv4的改变之处,所以下载了最新的opencv4.0.1. vs2017的安装请自行搜索安装,本 ...

  10. 系统、决策、控制研究系列(SSDC)

    本类目主要介绍的书籍来自springer的系列书籍中的一本,对于该系列书籍介绍如下: “系统.决策及控制研究”(SSDC)系列涵盖了在广泛认知的系统.决策及控制的各个领域的快速.最新和高质量的最新发展 ...