python中的描述符

描述符:含有__set__,__get__,__delete__中的一个或者多个的新式类。        描述顾名思义,是描述别的类中的属性优先级:类属性》数据描述符》实例属性》非数据描述符  (含有__set__与__get__是数据描述符)

作用: 因为python语言比较自由,比如c++中 int x = 1;可是这里Python x=1就可以,很自由       有代理作用,类型检测,等等作用

 1 class miaoshufu:
 2     def __init__(self, k, expect_type):  # k是要描述的属性
 3         self.k = k
 4         self.type = expect_type
 5
 6     def __set__(self, instance, value):  # instance 是实例本身,value是初始化的赋值 ,  owner是拥有它的类
 7         print("---------------set方法")
 8         if type(value) is self.type:
 9             print(instance)
10             print(value)
11             instance.__dict__[self.k] = value  # 将这个value这个值真的设置到instance即p这个实例中。这里只能重底层__dict__设置
12         else:
13             return print("%s 传入的类型错误" %value) # 用return终止赋值
14             # raise TypeError
15
16     def __get__(self, instance, owner):  # 这里必须有set,不然优先级靠后,实例前不能检测
17         print("-------------------get方法")
18         print(instance)
19         print(owner)
20         return instance.__dict__[self.k]
21
22     def __delete__(self, instance):
23         print("-------del")
24         instance.__dict__.pop(self.k)
25
26
27 class People(object):
28     name = miaoshufu(‘name‘, str)          # 类中name这个属性被上面的描述符描述
29
30     def __init__(self, name, age, salary):
31         self.name = name
32         self.age = age
33         self.salary = salary
34
35
36 if __name__ == ‘__main__‘:
37     p = People(‘wan‘, 24, 1)          # 触发描述符中的__set__
38
39     p.name = ‘li‘                     # 触发描述符中的__set__
40     del p.name
41     print(p.__dict__)

原文地址:https://www.cnblogs.com/maxiaonong/p/9498103.html

时间: 2024-10-08 23:56:39

python中的描述符的相关文章

python2.7高级编程 笔记二(Python中的描述符)

Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些"中级"的语言特性有着完善的文档,并且易于学习. 但是这里有个例外,那就是描述符.至少对于我来说,描述符是Python语言核心中困扰我时间最长的一个特性.这里有几点原因如下: 有关描述符的官方文档相当难懂,而且没有包含优秀的示例告诉你为什么需要编写描述符(我得为Raymond Hettinger辩护一

Linux中文件描述符和打开文件之间的关系

Linux中文件描述符和打开文件之间的关系 文件描述符: 在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表. Linux中的文件类型 Linux系统中把一切都看做文件,包括普通文件-.目录文件d.字符设备文件c.块设备文件b.符号链接文件l.文件描述符是内核为了高效管理已被打开的文件所创建的索引(一个非负整数),用于指代已被打开的文件,Linux下所有的的I/O操作的系统调用都是通过文件描述符执行.例如0表示标准输入.1表示标准输出.3表示标准错

实战丨Python黑魔法之描述符

引言 Descriptors(描述符)是Python语言中一个深奥但很重要的一个黑魔法,它被广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧.本文我将讲述描述符的定义以及一些常见的场景,并且在文末会补充一下__getattr,__getattribute__, __getitem__这三个同样涉及到属性访问的魔术方法. 描述符的定义 descr__get__(self, obj, objtype=None) --> value descr.__s

Linux中文件描述符fd和文件指针flip的理解

转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp. open:文件描述符的操作(如: open)返回的是一个文件描述符(int fd),内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用(fd1,fd2,fd3...); fopen:而流(如: f

python之属性描述符与属性查找规则

描述符 import numbers class IntgerField: def __get__(self, isinstance, owner): print('获取age') return self.num def __set__(self, instance, value): print('设置age值时') if not isinstance(value, numbers.Integral): raise ValueError('int need') self.num = value

python 将文件描述符包装成文件对象

有一个对应于操作系统上一个已打开的I/O 通道(比如文件.管道.套接字等)的整型文件描述符,你想将它包装成一个更高层的Python 文件对象. 一个文件描述符和一个打开的普通文件是不一样的.文件描述符仅仅是一个由操作系统指定的整数,用来指代某个系统的I/O 通道.如果你碰巧有这么一个文件描述符,你可以通过使用open() 函数来将其包装为一个Python 的文件对象.仅仅只需要使用这个整数值的文件描述符作为第一个参数来代替文件名即可 import os fd = os.open('somefil

Python中的切片符

最近在学python,感觉切片符有点难以理解.在网上查了点资料,然后做个总结 理解切片符,首先得知道数组是从0开始的, 而且切片符最后一个是-1. 我们先定义个数组   a=[1,2,3,4,5] 切片的几种格式: 1. a[b:c]  理解:从数组值b开始(包括)一直到数组值c结束(不包括) 实例:print a[2:4]   a的2:4是3,4,5, 因为切片最后的值是不包括的,所以输出的是[3,4] 2. a[b:] 理解:从索引值b开始(包括)到后面所有的值(数组有多少值就是到所有的值)

python - 装饰器+描述符(给类添加属性且属性类型审核)

装饰器+描述符 实现给一个类添加属性且对添加的时,对属性进行类型审核: def zsq(**kwargs): def fun(obj): for i,j in kwargs.items(): setattr(obj,i,mxf(i,j)) return obj return fun class mxf(): def __init__(self,na,ty): self.na = na self.ty = ty def __get__(self, instance, owner): return

python中的 @ 修饰符

今天学习廖老师的python教程,碰到了修饰符'@',不太了解,查看了下官方文档. 简单的整理下: @dec2 @dec1 def func(arg1, arg2, ...): pass 等价于 def func(arg1, arg2, ...): pass func = dec2(dec1(func)) 使用示例: 在comp.lang.python 和 python-dev的大部分讨论集中在更简捷地使用内置修饰符staticmethod() 和 classmethod() 上.但修饰符的功能