您的位置:首页 > 编程语言 > Python开发

Python3基础 描述符类与自制property方法 __get__,__set__,__delete__方法 讲一个特殊的类的实例指派给另一个类的属性

2017-01-22 14:49 911 查看
镇场诗:
    清心感悟智慧语,不着世间名与利。学水处下纳百川,舍尽贡高我慢意。
    学有小成返哺根,愿铸一良心博客。诚心于此写经验,愿见文者得启发。
——————————————————————————————————————————
ex1:
  code:

#描述符就是将某种特殊类型的类的实例指派给另一个类的属性

#特殊类型的要求,至少实现以下方法中的一个或者多个
#1 __get__(self,instance,owner) 用于访问属性,返回属性的值
#2 __set__(self,instance,value)   设置属性的值,不返回
#3 __delete__(self,instance)       删除操作

#这里我也没明白,只好仿照 小甲鱼老师的代码 抄一遍了
class MyDecriptor :
def __get__(self,instance,owner) :
print('getting',self,instance,owner)

def __set__(self,instance,value) :
print('setting',self,instance,value)

def __delete__(self,instance) :
print('deleting',self,instance)

class MyClass :
#一个属性
x=MyDecriptor()
#这个类很特殊,x是另外一个类的实例

#实例化MyClass类
test=MyClass()
print(test.x)

test.x=1   #赋值无效呀
print(test.x)


  result:

#可以从结果中,分析到一些什么
============== RESTART: C:\Users\Administrator\Desktop\COde.py ==============
getting <__main__.MyDecriptor object at 0x00000000034F9160> <__main__.MyClass object at 0x0000000003578048> <class '__main__.MyClass'>
None
setting <__main__.MyDecriptor object at 0x00000000034F9160> <__main__.MyClass object at 0x0000000003578048> 1
getting <__main__.MyDecriptor object at 0x00000000034F9160> <__main__.MyClass object at 0x0000000003578048> <class '__main__.MyClass'>
None
>>>


ex2:

  code:

#描述符就是将某种特殊类型的类的实例指派给另一个类的属性

#特殊类型的要求,至少实现以下方法中的一个或者多个
#1 __get__(self,instance,owner) 用于访问属性,返回属性的值
#2 __set__(self,instance,value)   设置属性的值,不返回
#3 __delete__(self,instance)       删除操作

class MyProperty :
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)

def __set__(self,instance,value) :
self.fset(instance,value)

def __delete__(self,instance) :
self.fdel(instance)

class MyClass :
def __init__(self) :
self._x=None #_x表示我不想直接访问他
#用property的方法对这个属性进行操作
def getX(self) :
return self._x

def setX(self,value):#原先我在def前面多打了一个空格。。。就报错了。看来,使用Python要细心呀
self._x=value

def delX(self):
del self._x
#注意参数的顺序
x=MyProperty(getX,setX,delX)
#我想通过这个x对_x属性进行赋值

#有了这个模板,可以延伸出来很多其他的功能吧。


  result:

============== RESTART: C:\Users\Administrator\Desktop\COde.py ==============
>>> test=MyClass()
>>> test.x=123
>>> test.x
123
>>> test._x #看看_x属性有没有被赋值
123
>>> del test.x
>>> test._x #看看我删除了x后,_x还在吗?
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
test._x #看看我删除了x后,_x还在吗?
AttributeError: 'MyClass' object has no attribute '_x'
>>>


——————————————————————————————————————————
博文的精髓,在技术部分,更在镇场一诗。Python版本3.5,系统 Windows7。
Python是优秀的语言,值得努力学习。我是跟着小甲鱼视频教程学习的,推荐。
我是一个新手,所以如果博文的内容有可以改进的地方,甚至有错误的地方,请留下评论,我一定努力改正,争取成就一个良心博客。
注:此文仅作为科研学习,如果我无意中侵犯了您的权益,请务必及时告知,我会做出改正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐