2016-04-29 2 views
1

В качестве официального демонстрационного описания here следующий код напечатает Retrieving var "x".Дескриптор данных Python не работает как переменная экземпляра?

class RevealAccess(object): 
    """A data descriptor that sets and returns values 
     normally and prints a message logging their access. 
    """ 

    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 


class MyClass1(object): 
    x = RevealAccess(10, 'var "x"') 

MyClass1().x 

Но если x является переменной экземпляра, дескриптор данных машин не будет работать, следующий код не будет ничего печатать.

class MyClass2(object): 
    def __init__(self): 
     self.x = RevealAccess(10, 'var "x"') 

MyClass2().x 

И, если я реализую дескриптор данных машины вручную, как описано here, следующий код будет Retrieving var "x" снова.

class MyClass3(object): 
    def __init__(self): 
     self.x = RevealAccess(10, 'var "x"') 

    def __getattribute__(self, key): 
     "Emulate type_getattro() in Objects/typeobject.c" 
     v = object.__getattribute__(self, key) 
     if hasattr(v, '__get__'): 
      return v.__get__(None, self) 
     return v 

MyClass3().x 

Итак, является ли дескриптор данных по умолчанию не реализованным, как описано в документе?

Я использую python 2.7.10.

ответ

3

Дескриптор как-то здесь не так. Python data model имеет правильное описание:

Следующие методы [__get__, __set__ и __delete__] применяются только тогда, когда экземпляр класса , содержащий метод (так называемый дескриптор класса) появляется в классе владельца (дескриптор должен быть либо в словаре владельца , либо в словаре классов для одного из его родителей).

Дескрипторы должны быть атрибутами класса.

 Смежные вопросы

  • Нет связанных вопросов^_^