Найти - Пользователи
Полная версия: Помогите разобраться с дескрипторами.
Начало » Python для новичков » Помогите разобраться с дескрипторами.
1
xost
Доброго времени суток.

Пытюсь разобраться с дескрипторами. Вот пример:

class Desc(object):
  val=0
  def __get__(self,instance,owner):
    print '__get__ method'
    return self.val
  def __set__(self,instance,val):
    self.val=val
class A(object):
  attr=Desc()
  arr=[Desc()]
a=A()
print a.attr
print a.arr[0]
Вывод:
__get__ method
0
<__main__.Desc object at 0x00B6D510>

Вопрос. Есть ли возможность работать с элементами массива a.arr, так же как с a.attr ?


Код - в теги!!!!
FishHook
Кривенько, конечно.

class Desc(object):
    val=0
    def __get__(self, instance, owner):
        return self.val
    def __set__(self, instance, val):
        self.val=val
class A(object):
    attr=Desc()
    arr=[Desc()]
    def __getitem__(self, item):
        return self.arr[item].__get__(None, None)
a=A()
print a.attr
print a[0]
xost
Ясно, т.е. какого-то красивого решения нет. Ок.
Тогда ещё вот такой вопрос, понимаю что наверное надо подъучить матчасть, но всё-же:
Почему такой код:
cclass Desc(object):
  val=0
  def __get__(self,instance,owner):
    print '__get__ method'
    return self.val
  def __set__(self,instance,val):
    print '__set__ method'
    self.val=val
class A(object):
  attr=Desc()
a=A()
b=A()
print id(a.attr)
print id(ba.attr)

Выдаёт одинаковые значения и как можно добиться чтоб a.attr и b.attr были различными ?
reclosedev
xost
Почему такой код
Выдаёт одинаковые значения
attr - Аттрибут класса A, инициализируется он один раз attr = Desc()
xost
как можно добиться чтоб a.attr и b.attr были различными ?
Можно хранить значения в инстансе
class Desc(object):
  val = 0
  def __get__(self, instance, owner):
    print 'get', instance, owner
    return getattr(instance, 'val', self.val)
  def __set__(self, instance, val):
    print 'set', instance, val
    instance.val = val
 
class A(object):
  attr = Desc()
 
a=A()
b=A()
print id(a.attr) == id(b.attr) # True
a.attr = 1
print id(a.attr) == id(b.attr) # False
Что конкретно пытаетесь сделать?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB