Управление методом считывания и методом set для класса Python

indexOf , возможно, но это - "расширение JavaScript стандарта ECMA-262; как таковой это не может присутствовать в других реализациях стандарта".

Пример:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS Microsoft делает не , предлагают некоторую альтернативу этому, но можно добавить схожую функциональность к массивам в Internet Explorer (и другие браузеры, которые не поддерживают indexOf), если Вы хотите, как , быстрый поиск Google показывает (например, этот ).

5
задан thomas 6 August 2009 в 21:46
поделиться

6 ответов

Вам нужен особый случай d_dict.

Хотя, конечно, в приведенном выше коде все, что вы делаете, - это реплицируйте то, что любой объект делает с __ dict __ уже, поэтому это довольно бессмысленно. Правильно ли я угадаю, если вы намеревались выделить какие-то атрибуты в особом случае и на самом деле использовали для них методы?

В этом случае вы можете использовать свойства.

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x
3
ответ дан 13 December 2019 в 22:12
поделиться

Особый регистр __ dict __ работает следующим образом:

def __init__(self):
    self.__dict__['d_dict'] = {}

Для этого нет необходимости использовать класс нового стиля.

3
ответ дан 13 December 2019 в 22:12
поделиться

проблема, похоже, возникла во время оценки вашего кода в методе __init__. Вы можете определить метод __new__ и инициализировать там переменную d_dict вместо __init__. Это немного хакерское, но работает, не забудьте прокомментировать это, так как через несколько месяцев это будет абсолютная магия.

>>> class  Foo(object):
...     def __new__(cls, *args):
...             my_cls = super(Foo, cls).__new__(cls, *args)
...             my_cls.d_dict = {}
...             return my_cls

>>> f = Foo()
>>> id(f.d_dict)
3077948796L
>>> d = Foo()
>>> id(d.d_dict)
3078142804L

Слово, объясняющее, почему я считаю это хакерским: вызов __new__ возвращает новый экземпляр класса так что тогда d_dict инициализирован там вроде static , но он инициализируется новым экземпляром словаря каждый раз, когда класс « создан », поэтому все работает так, как вам нужно .

2
ответ дан 13 December 2019 в 22:12
поделиться

Стоит помнить, что __ getattr __ вызывается только в том случае, если атрибут не существует в объекте, тогда как __ setattr __ вызывается всегда.

1
ответ дан 13 December 2019 в 22:12
поделиться

Решение , не очень питонический, но работает. Как указал Леннарт Регебро, вы должны использовать специальный случай для d_dict.

class Token(object):

    def __init__(self):
        super(Token,self).__setattr__('d_dict', {})

    def __getattr__(self,name):
        return self.a[name]

    def __setattr__(self,name,value):
        self.a[name] = value

Необходимо использовать новые классы стилей.

1
ответ дан 13 December 2019 в 22:12
поделиться

Думаю, мы сможем что-то сказать об общем дизайне вашего класса, если вы объясните его цель. Например,

# This is a class that serves as a dictionary but also has user-defined methods
class mydict(dict): pass

# This is a class that allows setting x.attr = value or getting x.attr:
class mysetget: pass

# This is a class that allows setting x.attr = value or getting x.attr:
class mygetsethas: 
    def has(self, key):
        return key in self.__dict__

x = mygetsethas()
x.a = 5
print(x.has('a'), x.a)

Я думаю, что последний класс наиболее близок к тому, что вы имели в виду, и мне также нравится играть с синтаксисом и получать от этого массу удовольствия, но, к сожалению, это не очень хорошо. Причины, по которым не рекомендуется использовать атрибуты объекта для повторной реализации словаря: вы не можете использовать x.3 , вы конфликтуете с x.has () , вам нужно поставить кавычки в есть ('a') и многие другие.

0
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: