鱼C论坛

 找回密码
 立即注册
查看: 3290|回复: 5

[技术交流] 《零基础入门学习Python》46讲内容归纳

[复制链接]
发表于 2016-3-13 20:06:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 醉酒青牛 于 2016-3-13 23:19 编辑

小牛有话说:
        各位鱼油,大家好。我是小牛,时光荏苒,岁月如梭,一晃半年过去了,小牛希望能在新的一年里把前面挖的坑给填起来,也衷心地希望各位鱼油能在阅读帖子过程中有所收获。。。。。。

本期主要内容导读:
        这一期我们归纳一下鱼神第四十六讲“魔法方法:描述符”。这一期里面鱼神首先讲解了描述符的概念,在此基础上给出了描述符的使用方法及复习了上一节中已经介绍的描述符property,再次向我们展示了Python处处皆对象的特性。接下来通过实现一个华氏度和摄氏度转换的程序介绍了描述符的基本应用。下面,我们将对上述内容进行详细展开

1. 描述符概念及使用方法
        描述符是一种特殊的类,其类内必须包含至少以下三个方法中的一个:__get__(self,instance,owner),__set__(self,instance,value),__delete__(self,instance),且该类的实例对象必须是另一个类的属性。举例说明并给出self,instance,owner的含义。
class Mydescriptor:           #包含了三个必须的属性
    def __get__(self,instance,owner):
        print("getting",self,instance,owner)
    def __set__(self,instance,value):
        print("getting",self,instance,value)
    def __delete__(self,instance):
        print("deleting",self,instance)
class T:
    x = Mydescriptor()       #将描述符类实例给类T的属性x
>>> t = T()
>>> t.x                            #调用T类的对象t的属性x
getting <__main__.Mydescriptor object at 0x000000000348A6D8> <__main__.T object at 0x0000000003495390> <class '__main__.T'>
#表明 self为类Mydescriptor的对象x,instance则为类T的对象t,而owner则为类T
>>> t.x = 3
getting <__main__.Mydescriptor object at 0x000000000348A6D8> <__main__.T object at 0x0000000003495390> 3
#表明value为3
>>> del t.x
deleting <__main__.Mydescriptor object at 0x000000000348A6D8> <__main__.T object at 0x0000000003495390>

2. 重新认识property方法,我们知道property方法使用过程为先定义一个类,类内定义调用属性、设置属性和删除属性的方法并将这些方法做为property的参数赋值赋值给该类的一个属性。在这里,property其实就是一个描述符类,而类内属性正是property类的实例化对象。下面我们将通过一个自己定义的类Myproperty来再现property类的功能。
class Myproperty:         #与property类功能一样的用户自定义类
    def __init__(self,fget=None,fset=None,fdel=None):      #构造函数
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        
    def __get__(self,instance,owner):
        return self.fget(instance)                   #这里面instance是类的实例
        
    def __set__(self,instance,value):
        self.fset(instance,value)
        
    def __delete__(self,instance):
        self.fdel(instance)
        
class C:
    def __init__(self,value=3):
        self.value = value
        
    def fget(self):
        return self.value

    def fset(self,value):
        self.value = value

    def fdel(self):
        del self.value
    x = Myproperty(fget,fset,fdel)
>>> t = C()
>>> t.x
3
>>> t.x = 5
>>> t.x
5
>>> del t.x
3. 一个更具体的描述符的应用程序
        定义一个温度类,可以实现摄氏度和华氏温度之间互相转换。程序如下:
class Celcius:
    def __init__(self,value=26.0):   #构造函数
        self.value = float(value)
    def __get__(self,instance,owner):   
        return self.value
    def __set__(self,instance,value):
        self.value = float(value)
class Fahrenheit:
    def __get__(self,instance,owner):
        return instance.cel*1.8+32
    def __set__(self,instance,value):
        instance.cel = (float(value)-32)/1.8
class Temprature:
    cel = Celcius(30)
    fah = Fahrenheit()
>>> t = Temprature()
>>> t.cel
30.0
>>> t.fah
86.0
>>> t.fah = 50
>>> t.fah
50.0
>>> t.cel
10.0

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-19 16:18:05 | 显示全部楼层
先下载下来,再顶青牛兄!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-18 13:33:35 | 显示全部楼层
理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-30 16:25:50 | 显示全部楼层
很清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-8 17:16:51 | 显示全部楼层
请问property是不是在py2跟py3运行时不一样的啊

py2.7

py2.7

py3.5

py3.5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-8 11:39:36 | 显示全部楼层
第一段代码有点问题吧?
__set__下面的print里应该写'setting'而不是'getting'吧 不然与上面__get__的打印内容区分不开了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 14:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表