Как правило, вы можете сравнить client[Height|Width]
с scroll[Height|Width]
, чтобы обнаружить это ... но значения будут одинаковыми при видимости переполнения. Таким образом, для этой процедуры необходимо учитывать процедуру обнаружения:
// Determines if the passed element is overflowing its bounds,
// either vertically or horizontally.
// Will temporarily modify the "overflow" style to detect this
// if necessary.
function checkOverflow(el)
{
var curOverflow = el.style.overflow;
if ( !curOverflow || curOverflow === "visible" )
el.style.overflow = "hidden";
var isOverflowing = el.clientWidth < el.scrollWidth
|| el.clientHeight < el.scrollHeight;
el.style.overflow = curOverflow;
return isOverflowing;
}
Проверено в FF3, FF40.0.2, IE6, Chrome 0.2.149.30.
Это - более простая версия Вашего класса DictObj:
class DictObj(object):
def __getattr__(self, attr):
return self.__dict__.get(attr)
>>> d = DictObj()
>>> d.something = 'one'
>>> print d.something
one
>>> print d.somethingelse
None
>>>
Ваш пример DictObj на самом деле довольно распространен. Доступ записи через точку стиля объекта может быть победой, если Вы имеете дело с вЂthings, которые напоминают objects’, т.е. они зафиксировали имена свойства, содержащие только символы, допустимые в идентификаторах Python. Материал как строки базы данных или представления формы может быть полезно сохранен в этом виде объекта, делая код немного более читаемым без избытка ['доступ объекта'].
реализация немного ограничена - Вы не получаете хороший синтаксис конструктора dict, len (), сравнения, 'в', повторение или хороший reprs. Можно, конечно, реализовать те вещи сами, но в мире модернизированных классов можно получить их бесплатно путем простого разделения на подклассы dict:
class AttrDict(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
Для получения поведения значения по умолчанию ни одного просто разделите Python 2.5's на подклассы collections.defaultdict класс вместо dict.
Относительно эти DictObj
, следующее работало бы на Вас? Пустой класс позволит Вам произвольно добавлять к или материал замены в контейнерном объекте.
class Container(object):
pass
>>> myContainer = Container()
>>> myContainer.spam = "in a can"
>>> myContainer.eggs = "in a shell"
, Если Вы хотите не бросить AttributeError, когда нет никакого атрибута, что Вы думаете о следующем? Лично, я предпочел бы использовать dict для ясности или использовать пункт попытки/кроме.
class QuietContainer(object):
def __getattr__(self, attribute):
try:
return object.__getattr__(self,attribute)
except AttributeError:
return None
>>> cont = QuietContainer()
>>> print cont.me
None
Право?
Насколько я знаю, классы Python используют словари для хранения их атрибутов так или иначе (это скрыто от программиста), таким образом, это смотрит на меня, что, что Вы сделали, существует, эффективно эмулируют класс Python... с помощью класса Python.
Не "неправильно" сделать это, и может быть более хорошо, если Ваши словари имеют большую вероятность того, чтобы превращаться в объекты в какой-то момент, но опасаться причин того, чтобы иметь доступ скобки во-первых:
Также имеют в виду, что можно всегда делать доступ объектов как словари, если Вы решаете переключиться на объекты позже.
Для случая как это я принял бы значение по умолчанию к "молитве" количеств удобочитаемости: по-видимому, другие Python программисты будут читать Ваш код, и они, вероятно, не будут ожидать гибриды словаря/объекта везде. Если бы это - хорошее проектное решение для конкретной ситуации, используйте его, но я не использовал бы его без необходимости сделать так.
Один главный недостаток использования чего-то как Ваш DictObj является Вами или должен ограничить допустимые ключи, или у Вас не может быть методов на Вашем DictObj такой как .keys()
, .values()
, .items()
, и т.д.
Мне нравится запись через точку намного лучше, чем поля словаря лично. Причина, являющаяся этим, это заставляет автозавершение работать намного лучше.
Это не плохо, если это служит Вашей цели. "Практичность бьет чистоту".
я видел такой подход elserwhere (например, в Дорожный бетоноукладчик ), таким образом, это можно рассмотреть общая потребность (или требование).