醉酒青牛 发表于 2016-3-13 20:06:02

《零基础入门学习Python》46讲内容归纳

本帖最后由 醉酒青牛 于 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

太空军校生 发表于 2016-4-19 16:18:05

先下载下来,再顶青牛兄!

龙sir 发表于 2016-7-18 13:33:35

理解了

zhy123 发表于 2016-8-30 16:25:50

很清楚

小田鸡 发表于 2016-10-8 17:16:51

请问property是不是在py2跟py3运行时不一样的啊

从未恐惧丶 发表于 2021-2-8 11:39:36

第一段代码有点问题吧?
__set__下面的print里应该写'setting'而不是'getting'吧 不然与上面__get__的打印内容区分不开了
页: [1]
查看完整版本: 《零基础入门学习Python》46讲内容归纳