我该如何使用'__set__'

时间:2010-01-05 00:13:13

标签: python

class A(object):
    def __get__(self, instance, owner):#why i can't find argument 'key',where is 'key'
        #print ower.instance
        print instance,owner
    def __set__(self,instance,value):
        instance=value

class X(object):
    a = A()

xx=X()
xx.a='aaa'
print xx.a#None

3 个答案:

答案 0 :(得分:4)

Hettinger的HowTo Guide for Descriptors涵盖了这一点。引用它:

  

描述符协议

     

descr.__get__(self, obj, type=None) --> value

     

descr.__set__(self, obj, value) --> None

     

descr.__delete__(self, obj) --> None

     

这就是它的全部内容。

所以,你可以根据自己的意愿命名参数,但通常没有名为key__get__的参数(不知道你为什么试图找到它)​​。

再次来自该网址的示例:

类RevealAccess(对象):     msgstr“”“设置和返回值的数据描述符        通常并打印记录其访问权限的消息。     “”“

def __init__(self, initval=None, name='var'):
    self.val = initval
    self.name = name

def __get__(self, obj, objtype):
    print 'Retrieving', self.name
    return self.val

def __set__(self, obj, val):
    print 'Updating' , self.name
    self.val = val

通常情况下,您在self.something(和/或__init__(如果您定义))中设置__set__,并根据self.something中的__get__返回一些内容。当然这个例子只是print获取和设置的“东西”,通常你会做更实质的事情; - )。

答案 1 :(得分:2)

你的意思是使用__getattribute__吗?它有一个通常称为key的参数;虽然它可以是任何名字。你对__set__的定义看起来应该是__setattribute __

答案 2 :(得分:1)

我想你可以阅读描述符:

http://users.rcn.com/python/download/Descriptor.htm

或许您想要的是自定义属性访问:

http://docs.python.org/reference/datamodel.html#customizing-attribute-access

也许这个指针可以帮到你,或者你可能更具体一点?