pycharm测试用例,用python实现自动化测试用例
一般来说,描述符是一个具有“绑定行为”的对象属性,它的访问控制被描述符的协议方法覆盖。这些方法是__get__(,__set__)和__delete__)。具有这些方法的对象称为描述符。
默认属性的访问控制是从对象的字典(__dict__)中获取(get)、设置(set)和删除(delete)。比如a.x的搜索顺序是a.__dict__[x],然后是(a)类型的元类。_ _ dict _ [x],a)类型的父类。请注意,描述符只在新类中有效。(新类是从类型或对象继承的类。)
描述符功能强大,应用广泛。描述符是属性、实例方法、静态方法、类方法和super背后的实现机制。Python本身广泛使用描述符来实现Python 2.2中引入的新类。描述符简化了底层C代码,为Python的日常编程提供了一套灵活的新工具。
描述。__get__(self,obj,type=None ) - value
描述。__get__(self,obj,value ) -无
描述。__delete__(self,obj ) -无
如果对象是一个描述符,那么当它被当作对象的一个属性时,默认的搜索行为将被覆盖。
如果一个对象同时定义了__get__和__set__的话,它就被称为数据描述符。只定义__get__的描述符称为非数据描述符。
数据描述符和非数据描述符的区别在于相对于实例字典的优先级。如果实例的字典中存在与描述符同名的属性,如果描述符是数据描述符,则数据描述符优先。对于非数据描述符,字典属性优先。类别(对象):
def __init__(self):
self.name=mink
def __get__(self,obj,objtype=None):
返回自己的名字
a类(对象):
name=B()
a=A())).
A._ _ dict _ _ # print {}
印花貂皮大衣
名称=kk
普林塔。_ _ dict _ # print { name : kk }
打印a.name #打印kk
其中b是非数据描述符,所以在a.name=kk 的情况下,a.__dict__有name属性,然后输入_ _ set _ _ def _ _()
self.name=值。做某事
a=A())).
A._ _ dict _ _ # print {}
印花貂皮大衣
名称=kk
A._ _ dict _ _ # print {}
打印a.name #打印kk
A.__dict__为空,因为数据描述符访问属性的优先级高于实例的字典。
呼叫描述符
描述符可以这样直接调用。d.__get__(obj)
但是,在访问属性时,描述符通常会被自动调用。比如obj.d在obj的字典里找d。如果D定义了__get__方法,则根据以下优先级规则调用d.__get__(obj):
调用的细节取决于obj是一个类还是一个实例。此外,描述符只对新类型的对象和类有效。由object继承的类称为新类型。
为此,方法对象的实现。__getattribute__()是将b.x转换为类型(b)。_dict_[x]。_get__,type) b)完整的C语言实现可以在Objects/object.c的PyObject_GenericGetAttr()中找到
对于类,方法类型。__getattribute__()将B.x设置为b. _ _ dict _ [x]。_ _ get _ _(无,b)
) 。Python将其描述为:def __getattribute__(self,key):
在Objects/typeobject.c 中模拟type_getattro()
v=对象。__getattribute__(self,key)
if hasattr(v, __get__ ):
return v.__get__(None,self)
返回v
要点:调用描述符是因为__getattribute__()重写了__getattribute__()方法,以防止普通描述符调用__getattribute__()。对象。_ _ getattribute _()和类型。_ _ getattribute _()仅适用于新类的实例。非数据描述符可能会被实例字典覆盖。(非数据描述符不如实例字典首选)super()返回的对象也有一个自定义__getattribute__()方法来调用描述符。当super(B,obj)。m()时,B旁边的基类A将在obj中找到。__class__。__mro__,然后是a. _ _ dict _ [m]。_ _ get _ _ (obj,a)将被返回。如果它不是一个描述符,它返回m。如果在实例字典中找不到M,就会继续调用object。__getattribute__()进行查找。(译者注:即在__mro__)的下一个基类中查找)
注意:在Python 2.2中,如果m是描述符,super(B,obj)。m()只会调用方法__get__()。在Python 2.3中,也会调用非数据描述符(除非是老式的类)。super_getattro()的实现细节是:Objects/typeobject.c,[del]达利鸭教程[/del]中实现了一个等价的Python。
上面显示了描述符的机制是在object、type和super的__getattribute__()方法中实现的。从object派生的类自动继承这种机制,或者它们有一个具有类似机制的元类。同样,您可以重写类的__getattribute__()方法来关闭该类的描述符行为。
描述符示例
在下面的代码中定义了一个数据描述符,它在每次get和set时打印一条消息。重写__getattribute__()是使所有属性都具有这种行为的另一种方法。然而,描述符在监控特定属性时非常有用。类RevealAccess(对象):
设置和返回值的数据描述符
并打印一条消息记录他们的访问。
def __init__(self,initval=None,name=var ):
self.val=initval
self.name=name
def __get__(self,obj,objtype):
打印“检索”,自我名称
返回self.val
def __set__(self,obj,val):
打印更新,自我名称
self.val=val
类MyClass(对象):
x=RevealAccess(10, var x )
y=5
m=MyClass()
m.x
正在检索变量“x”
10
m.x=20
更新变量“x”
m.x
正在检索变量“x”
20
m.y
五
这个协议非常简单,提供了令人兴奋的可能性。有些用途非常普遍,以至于被打包成独立的函数。属性、方法(绑定和未绑定方法)、静态方法和类方法都基于描述符协议。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。