Давайте посмотрим на цель метода __next__
. Из docs :
iterator .__ next __ ()
Возвращает следующий элемент из контейнера. Если дополнительных элементов нет, вызовите исключение StopIteration.
Теперь давайте посмотрим, что делает инструкция
yield
. Другой отрывок из docs :Использование выражения yield в теле функции заставляет эту функцию быть генератором
И
Когда вызывается функция генератора, она возвращает итератор, известный как генератор.
Теперь сравните
__next__
иyield
:__next__
возвращает следующий элемент из контейнера. Но функция, содержащая ключевое словоyield
, возвращает итератор. Следовательно, использованиеyield
в методе__next__
приводит к итератору, который дает итераторы.Если вы хотите использовать
yield
, чтобы сделать свой класс итерабельным, сделайте это в__iter__
:class MyString: def __init__(self, s): self.s = s def __iter__(self): for s in self.s: yield s
Предполагается, что метод
__iter__
возвращает итератор - и ключевое словоyield
делает это именно так.Для полноты, вот как вы могли бы реализовать итератор с помощью метода
__next__
. Вы должны следить за состоянием итерации и возвращать соответствующее значение. Простейшим решением является, вероятно, увеличение индекса каждый раз, когда вызывается__next__
:class MyString: def __init__(self,s): self.s = s self.index = -1 def __iter__(self): return self def __next__(self): self.index += 1 if self.index >= len(self.s): raise StopIteration return self.s[self.index]
Я тоже искал это, как сумасшедший, и я просто понял это, попробовав разные вещи: P ... Ну, вы можете сделать это так:
composite.something, composite.else
{
blblalba
}
Это неожиданно сработало для меня: )
Как говорили другие, вы можете добавить несколько классов к элементу.
Но это не совсем так. Я задаю вопрос о наследовании. Реальная точка заключается в том, что наследование в CSS выполняется не через классы, а через иерархии элементов. Поэтому для моделирования унаследованных признаков вам необходимо применить их к различным уровням элементов в DOM.
Если вам нужен более мощный текстовый препроцессор, чем LESS, проверьте PPWizard:
http://dennisbareis.com/ppwizard.htm
Предупреждение, что сайт действительно отвратительный, и есть небольшая кривая обучения, но он идеально подходит для создания CSS и HTML-кода с помощью макросов. Я никогда не понимал, почему другие веб-кодеры не используют его.
Также есть SASS, который вы можете найти в http://sass-lang.com/ . Существует тег @extend, а также система типа микширования. (Ruby)
Это своего рода конкурент МЕНЬШЕ.
На самом деле то, что вы просите, существует, но это делается как дополнительные модули. Посмотрите этот вопрос на Better CSS в .NET для примеров.
Проверьте ответ Larsenal на использование LESS , чтобы понять, ons сделать.
Я столкнулся с этой проблемой и в итоге использовал решение JQuery, чтобы заставить его выглядеть как класс, который может наследовать другие классы.
<script>
$(function(){
$(".composite").addClass("something else");
});
</script>
Это найдет все элементы с классом «композитный» и добавьте к элементам классы «что-то» и «еще». Итак, что-то вроде <div class="composite">...</div>
закончится так: <div class="composite something else">...</div>
В определенных обстоятельствах вы можете выполнить «мягкое» наследование:
.composite
{
display:inherit;
background:inherit;
}
.something { display:inline }
.else { background:red }
Это работает только в том случае, если вы добавляете класс .composite к дочернему элементу. Это «мягкое» наследование, потому что любые значения, не указанные в .composite, явно не наследуются. Имейте в виду, что все равно было бы меньше символов просто писать «inline» и «red» вместо «inherit».
Вот список свойств и независимо от того, делают они это автоматически: https://www.w3.org/TR/CSS21/propidx.html
Лучшее, что вы можете сделать, это
CSS
.car {
font-weight: bold;
}
.benz {
background-color: blue;
}
.toyota {
background-color: white;
}
HTML
<div class="car benz">
<p>I'm bold and blue.</p>
</div>
<div class="car toyota">
<p>I'm bold and white.</p>
</div>
.composite,.something { display:inline }
и .composite,.else { background:red }
– Pavel Gatnar
11 September 2015 в 19:58
.something
и .else
в других определениях css.
– Alter Lagos
14 September 2015 в 18:24
Вы можете достичь того, чего хотите, если предварительно обрабатываете свои .css-файлы через php. ...
$something='color:red;'
$else='display:inline;';
echo '.something {'. $something .'}';
echo '.else {'. $something .'}';
echo '.somethingelse {'. $something .$else '}';
...
Я понимаю, что этот вопрос сейчас очень старый, но здесь нет ничего!
Если целью является добавление одного класса, который подразумевает свойства нескольких классов, в качестве собственного решения, я бы рекомендовал использовать JavaScript / jQuery (jQuery действительно не обязательно, но, безусловно, полезно)
Если у вас есть, например, .umbrellaClass
, который «наследует» от .baseClass1
и .baseClass2
, у вас может быть какой-то JavaScript, который стреляет готов .
$(".umbrellaClass").addClass("baseClass1");
$(".umbrellaClass").addClass("baseClass2");
Теперь все элементы из .umbrellaClass
будут иметь все свойства обоих .baseClass
s. Обратите внимание, что, как и наследование ООП, .umbrellaClass
может иметь или не иметь свои собственные свойства.
Единственное предостережение здесь состоит в том, чтобы рассмотреть, есть ли элементы, которые динамически создаются, которые не будут существовать, когда этот код срабатывает, но есть и другие способы.
Отстой Css не имеет нативного наследования.
К сожалению, CSS не обеспечивает «наследование» так, как это делают языки программирования, такие как C ++, C # или Java. Вы не можете объявить класс CSS, а затем расширить его с помощью другого класса CSS.
Однако вы можете применить более одного класса к тегу в вашей разметке ... в этом случае есть сложный набор правил, определяющих, какие фактические стили будут применяться браузером.
<span class="styleA styleB"> ... </span>
CSS будет искать все стили, которые можно применить на основе вашей разметки, и объединить стили CSS из этих нескольких правил.
Как правило, стили сливаются, но когда возникают конфликты, более поздний объявленный стиль, как правило, выигрывает (если только важный атрибут не указан в одном из стилей, и в этом случае выигрывает). Кроме того, стили, применяемые непосредственно к элементу HTML, имеют приоритет над стилями класса CSS.
Вы можете добавить несколько классов к одному элементу DOM, например
<div class="firstClass secondClass thirdclass fourthclass"></div>
Наследование не является частью стандарта CSS.
.firstClass {font-size:12px;} .secondClass {font-size:20px;}
окончательно font-size
будет 12px
или 20px
и является ли этот кросс-браузер безопасным?
– Marco Demaio
23 February 2012 в 21:17
Less and Sass - предварительные процессоры CSS, которые расширяют язык CSS ценными способами. Только одно из многих улучшений, которые они предлагают, - это именно тот вариант, который вы ищете. Есть несколько очень хороших ответов с Less и я добавлю решение Sass.
У Sass есть опция расширения, которая позволяет одному классу полностью перейти на другой. Подробнее о расширении вы можете прочитать в этой статье
Вы можете достичь поведения, подобного наследованию, таким образом:
.p,.c1,.c2{...}//parent styles
.c1{...}//child 1 styles
.c2{...}//child 2 styles
См. http://jsfiddle.net/qj76455e/1/
Самое большое преимущество этого подхода - модульность - вы не создаете зависимости между классами (как это происходит, когда вы «наследуете» класс с использованием препроцессора). Поэтому любой запрос на изменение CSS не требует какого-либо большого анализа влияния.
Вы можете применить более одного класса CSS к элементу чем-то вроде этого класса = "something else"
Для тех, кто не удовлетворен указанными (отличными) сообщениями, вы можете использовать свои навыки программирования, чтобы сделать переменную (PHP или любой другой), и хранить в ней несколько имен классов.
Это
<style>
.red { color: red; }
.bold { font-weight: bold; }
</style>
<? define('DANGERTEXT','red bold'); ?>
Затем примените глобальную переменную к желаемому элементу, а не к самим именам классов
<span class="<?=DANGERTEXT?>"> Le Champion est Ici </span>
Хотя прямое наследование невозможно.
Можно использовать класс (или id) для родительского тега, а затем использовать комбайны CSS для изменения поведения дочернего тега из его иерархии.
p.test{background-color:rgba(55,55,55,0.1);}
p.test > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
<p class="test"><span>One <span>possible <span>solution <span>is <span>using <span>multiple <span>nested <span>tags</span></span></span></span></span></span></span></span></p>
Я бы не предложил использовать так много пролетов, как пример, но это всего лишь доказательство концепции. Есть еще много ошибок, которые могут возникнуть при попытке применить CSS таким образом. (Например, изменение типов оформления текста).
Элемент может принимать несколько классов:
.classOne { font-weight: bold; }
.classTwo { font-famiy: verdana; }
<div class="classOne classTwo">
<p>I'm bold and verdana.</p>
</div>
И это примерно так же близко, как вы к сожалению. Мне бы хотелось увидеть эту функцию вместе с классными псевдонимами.
CSS действительно не делает то, что вы просите. Если вы хотите написать правила с этой сложной идеей, вы можете проверить compass . Это структура стилей, которая похожа на уже упомянутую «Меньшую».
Это позволяет вам делать миксины и весь этот хороший бизнес.
font-size
? – abatishchev 18 December 2011 в 21:02font-size: 16px
никогда не может вступить в силу, верно? – O. R. Mapper 29 August 2015 в 11:38h1, h2, etc
вы можете указать.selector1, .selector2, .etc
– JeffryHouser 1 March 2016 в 19:05