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 показывает (например, этот ).
Вам нужен особый случай 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
Особый регистр __ dict __
работает следующим образом:
def __init__(self):
self.__dict__['d_dict'] = {}
Для этого нет необходимости использовать класс нового стиля.
проблема, похоже, возникла во время оценки вашего кода в методе __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 , но он инициализируется новым экземпляром словаря каждый раз, когда класс « создан », поэтому все работает так, как вам нужно .
Стоит помнить, что __ getattr __
вызывается только в том случае, если атрибут не существует в объекте, тогда как __ setattr __
вызывается всегда.
Решение , не очень питонический, но работает. Как указал Леннарт Регебро, вы должны использовать специальный случай для 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
Необходимо использовать новые классы стилей.
Думаю, мы сможем что-то сказать об общем дизайне вашего класса, если вы объясните его цель. Например,
# 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')
и многие другие.