property ,classmethod的来历-描述符

我在想怎么让一个属性只读,这让我想起来了classmethod,都知道classmethod就是只能让类来调用,所以呢,这里它们都用到一个东西描述符。

1描述符有两种:

1)数据描述符,实现了__get__和__set__的类。

2)非数据描述符,只实现了__get__的类。

2,实例查找属性的顺序链,ex,obj = EX(),在访问obj.attr的时候,

1)如果attr存在是数据描述符且存在于EX或者其父类中,则直接返回。

2)如果attr存在是属性且存在于obj或者其父类中,则直接返回。

3) 如果attr存在是非数据描述符且存在于EX或者其父类中,则直接返回。

4)如果attr存在是属性且存在于EX或者其父类中,则直接返回。

5)如果attr在__attr__中,则直接返回。

6)抛出属性错误异常。

3,实际例子。

class myclassmethod(object):

def __init__(self, fun):

self.fun = fun

def __get__(self, obj, type):

    

    def _excute(*args, **kwargs):
...       new_args = list(args).insert(0, type)
       result = self.fun(*new_args, **kwargs)
...       return result

if obj  == None:

      returun self._excute

else:

print ‘instance is not call----‘

这样就完成了一个classmethod,同理,property,当然只读方法或者属性可以重写__set__方法。

好了,描述符就先记到这里。

时间: 2024-08-01 18:48:49

property ,classmethod的来历-描述符的相关文章

python描述符、property、函数(类)装饰器实例解析

1 import sys 2 3 ''' 4 当使用实例对象访问属性时,都会调用__getattribute__内建函数 5 __getattribute__查找属性的优先级 6 1.类属性 7 2.数据描述符 8 3.实例属性 9 4.非数据描述符 10 5.__getattr__() 11 12 #实例.属性 13 c.x ==>type(x).__dict__['x'].__get__(x,type(x)) 14 #类.属性 15 C.x ==>X.__dict__['x'].__get

Python的特性(Property)和描述符

特性(Property) 特性是对类的一个特定属性进行拦截,在操作这个属性时,执行特定的函数,对属性的操作进行拦截. 特性的实现 特性使用property类来实现,也可以使用property装饰器实现,二者本质是一样的. property类的__init__函数接收4个参数,来实现属性的获取.赋值.删除及文档. def __init__(self, fget=None, fset=None, fdel=None, doc=None): # known special case of proper

课时46:魔法方法:描述符(property的原理)

目录: 一.描述符(property的原理) 二.课时46课后习题及答案 ********************************** 一.描述符(property的原理) ********************************** 本节要讲的内容叫作描述符,用一句话解释,描述符就是将某种特殊类型的类的实例指派给另一个类的属性.那什么是特殊类型的类呢?就是至少要在这个类里边定义__get__().__set__()或__delete__()三个特殊方法中的任意一个. 下表列举了

python Descriptor (描述符)

简介: python 描述符是新式类(继承自object)中的语言协议,基于描述符可以提供更佳优雅的解决方案. python的classmethod, staticmethod, property都是基于描述符建立的. 描述符的协议: 定义了__set__, __get__, __delete__3个方法中任何一个方法的object可以作为描述符. 描述符分类: 同时定义了__set__,__get__被叫做data descriptor. 只定义了__get__被叫做no-data descr

Python 为什么要使用描述符?

学习 Python 这么久了,说起 Python 的优雅之处,能让我脱口而出的, Descriptor(描述符)特性可以排得上号. 描述符 是Python 语言独有的特性,它不仅在应用层使用,在语言的基础设施中也有涉及. 我可以大胆地猜测,你对于描述符的了解是始于诸如 Django ORM 和 SQLAlchemy 中的字段对象,是的,它们都是描述符.你的它的认识,可能也止步于此,如果你没有去深究,它为何要如此设计?也就加体会不到 Python 给我们带来的便利与优雅. 由于 描述符的内容较多,

python 描述符 上下文管理协议 类装饰器 property metaclass

1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分python类特性中的底层魔法,包括@classmethod,@staticmethd,@property甚至是__slots__属性 描述符是很多高级库和框架的重要工具之一,描述符通常是使用到装饰器或者元类的大型框架中的一个组件 注意事项: 一 描述符本身应该定义成新式类,被代理的类也应该是新式类 二

通过描述符自定制@property的功能

# 通过描述符自定制@property的功能 # 原始通过@property实现的功能:将类中定义的函数属性,通过装饰器@property将其封闭成数据属性 class Room: def __init__(self, name, width, length): self.name = name self.width = width self.length = length @property def area(self): return self.width * self.length r1

利用描述符自定制property

1 class property2: 2 def __init__(self, func): 3 print('执行property2') 4 self.func = func 5 6 def __get__(self, instance, owner): 7 return self.func(instance) 8 9 10 class Room: 11 def __init__(self, name, width, length): 12 self.name = name 13 self.w

Python描述符常用场景详解

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