как я могу использовать '__set__' - PullRequest
1 голос
/ 05 января 2010
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 ]

4 голосов
/ 05 января 2010

Руководство по дескрипторам Hettinger's хорошо описывает это. Цитата из него:

Дескриптор протокола

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

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

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

Это все, что нужно.

Итак, вы можете называть аргументы по своему усмотрению, но обычно нет аргументов с именами от key до __get__ (понятия не имею, почему вы пытаетесь его найти).

Снова пример с этого URL:

класс RevealAccess (объект): "" "Дескриптор данных, который устанавливает и возвращает значения нормально и печатает сообщение, регистрирующее их доступ. "" "

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 s "что-то" при получении и установке, обычно вы делаете что-то более существенное; -).

2 голосов
/ 05 января 2010

Вы хотите использовать __getattribute__? У него есть параметр, который обычно называется ключом; хотя это может быть любое имя. И определение, которое у вас есть для __set__, похоже, должно быть для __setattribute __

1 голос
/ 05 января 2010

Я думаю, вы могли бы прочитать о дескрипторах:

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

Или, может быть, вы хотите настроить доступ к атрибутам:

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

Может быть, эти указатели могут помочь вам, или, может быть, вы можете быть более конкретными?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...