Передача свойств от родительского к дочернему с & amp; оператор [дубликат]

Давайте посмотрим на цель метода __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]

633
задан CoderPi 9 December 2015 в 10:24
поделиться

21 ответ

Я тоже искал это, как сумасшедший, и я просто понял это, попробовав разные вещи: P ... Ну, вы можете сделать это так:

composite.something, composite.else
{
    blblalba
}

Это неожиданно сработало для меня: )

378
ответ дан CoderPi 20 August 2018 в 13:01
поделиться
  • 1
    wow, LESS в значительной степени именно то, что я ищу ... это позор, что он не поддерживается изначально, и что он написан на Ruby (я использую ASP.NET MVC) – Joel Martinez 30 June 2009 в 20:52
  • 2
    Да, я тоже в мире ASP.NET, поэтому я не переместил его в рабочий процесс. – Larsenal 30 June 2009 в 20:55
  • 3
    Меньше красиво и соблазнительно ... но я не очень успешно использовал его с CSSEdit в одном рабочем процессе, поэтому я еще не полностью его принял. – Ryan Florence 1 July 2009 в 19:42
  • 4
    Да, МЕНЬШЕ довольно мило, не так ли. Ive действительно работал над .NET-портом здесь: nlesscss.codeplex.com . – Owen 2 October 2009 в 09:48
  • 5
    если вы достигнете этого через google: порт .Net теперь здесь – Eonasdan 24 August 2011 в 20:57
  • 6
    Итак, каков будет результат font-size? – abatishchev 18 December 2011 в 21:02
  • 7
    Размер шрифта будет 12 пикселей для «p.Title». потому что он определяется после первого в файле. он переопределяет первый размер шрифта. – YWE 23 March 2012 в 16:14
  • 8
    Это сосать, но я рад, что у нас есть хотя бы это! – Pacerier 12 October 2012 в 11:08
  • 9
    я не искал его, но это было конструктивно для меня n__n – AgelessEssence 1 November 2012 в 00:41
  • 10
    Почему это отстой? это кажется очень хорошим. Я не могу понять разницу между символом запятой и решением less.js. – Revious 19 November 2013 в 19:53
  • 11
    Потому что если классы .something и .else находятся в разных файлах и что вы не можете их модифицировать, вы застряли. – Alexandre Mélard 25 March 2014 в 10:15
  • 12
    Просто, когда я подумал, что LESS больше меня не удивит ... Я понятия не имел, что вы можете импортировать форматирование из другого блока, как это. Отличный совет. – Daniel Rippstein 15 October 2014 в 20:50
  • 13
    Это очень близко к идеальному решению, я надеюсь, что люди не откажутся от него, потому что у него мало голосов. На самом деле одна из наиболее сложных проблем, связанных с наследованием CSS, заключается в том, что вы обычно получаете уже сделанное огромное программное обеспечение (например, электронную коммерцию или известное в блоге PHP программное обеспечение), и они используют PHP-код, который изначально не будет добавлять несколько классов в HTML-элементы, которые они выходят. Это заставляет вас обойтись и запутать исходный код (потеряет изменения, если вы обновите его позже), чтобы он выводил эти дополнительные классы. Вместо этого вы только редактируете CSS-файл! – Dario Fumagalli 12 December 2014 в 13:23
  • 14
    Это был правильный ответ, потому что он ответил на вопрос, используя чистый синтаксис CSS. Чем меньше ответа, тем лучше. – raddevus 6 August 2015 в 11:52
  • 15
    @YWE: Означает ли это, что декларации должны быть наоборот наоборот по сравнению с тем, что написано в этом ответе (по крайней мере, если мы хотим, чтобы пример был иллюстративным)? Если превалирует предыдущий, font-size: 16px никогда не может вступить в силу, верно? – O. R. Mapper 29 August 2015 в 11:38
  • 16
    очень сложно для анализа последствий, потому что вы создаете искусственные зависимости ... – Pavel Gatnar 11 September 2015 в 19:43
  • 17
    Для всех стилей в 1 файле есть наследование-подобное решение в CSS, см. Мой пост. – Pavel Gatnar 11 September 2015 в 20:01
  • 18
    Это именно то, что я искал. Стоит ли ничего такого же подхода работать с CSS Selectors? Вместо указания h1, h2, etc вы можете указать .selector1, .selector2, .etc – JeffryHouser 1 March 2016 в 19:05
  • 19
    yup, это (первая часть) было моим ожиданием, когда я впервые услышал о CSS еще в 20-м веке ... и у нас его еще нет, они сжигают производительность на некоторых динамических вещах, в то время как это может быть статическим, составленным перед применением css и он заменяет необходимость переменных (статические «переменные») – neu-rah 4 January 2017 в 20:23
  • 20
    Это должен быть исключенный ответ. – eaglei22 31 October 2017 в 19:58
381
ответ дан CoderPi 31 October 2018 в 10:27
поделиться

Как говорили другие, вы можете добавить несколько классов к элементу.

Но это не совсем так. Я задаю вопрос о наследовании. Реальная точка заключается в том, что наследование в CSS выполняется не через классы, а через иерархии элементов. Поэтому для моделирования унаследованных признаков вам необходимо применить их к различным уровням элементов в DOM.

3
ответ дан Assaf Lavie 20 August 2018 в 13:01
поделиться
  • 1
    Лучше создавать определения наследования, подобные CSS, вместо использования всей цепочки классов состава, см. Мой пост. – Pavel Gatnar 11 September 2015 в 20:06

Если вам нужен более мощный текстовый препроцессор, чем LESS, проверьте PPWizard:

http://dennisbareis.com/ppwizard.htm

Предупреждение, что сайт действительно отвратительный, и есть небольшая кривая обучения, но он идеально подходит для создания CSS и HTML-кода с помощью макросов. Я никогда не понимал, почему другие веб-кодеры не используют его.

0
ответ дан BloDoe 20 August 2018 в 13:01
поделиться
  • 1
    Веб-сайт действительно отвратительный. – Andrey Akhmetov 2 August 2012 в 19:52
  • 2
    Вид иронии на сайте для html-процессора! – Ben Thurley 30 October 2012 в 11:35
  • 3
    Да, сайт ужасен, но это больше, чем просто. Трудно читать, и у меня болит голова! – ArtOfWarfare 6 September 2013 в 20:09
  • 4
    Хорошо, что он совместим с Windows 3.1 до XP, LOL – Alter Lagos 14 September 2015 в 18:28
  • 5
    Причудливый нестандартный инструмент, нет. – berkus 8 March 2017 в 21:57

Также есть SASS, который вы можете найти в http://sass-lang.com/ . Существует тег @extend, а также система типа микширования. (Ruby)

Это своего рода конкурент МЕНЬШЕ.

3
ответ дан chug2k 20 August 2018 в 13:01
поделиться

На самом деле то, что вы просите, существует, но это делается как дополнительные модули. Посмотрите этот вопрос на Better CSS в .NET для примеров.

Проверьте ответ Larsenal на использование LESS , чтобы понять, ons сделать.

1
ответ дан Community 20 August 2018 в 13:01
поделиться

Я столкнулся с этой проблемой и в итоге использовал решение JQuery, чтобы заставить его выглядеть как класс, который может наследовать другие классы.

<script>
    $(function(){
            $(".composite").addClass("something else");
        });
</script>

Это найдет все элементы с классом «композитный» и добавьте к элементам классы «что-то» и «еще». Итак, что-то вроде <div class="composite">...</div> закончится так: <div class="composite something else">...</div>

24
ответ дан DHoover 20 August 2018 в 13:01
поделиться

В определенных обстоятельствах вы можете выполнить «мягкое» наследование:

.composite
{
display:inherit;
background:inherit;
}

.something { display:inline }
.else      { background:red }

Это работает только в том случае, если вы добавляете класс .composite к дочернему элементу. Это «мягкое» наследование, потому что любые значения, не указанные в .composite, явно не наследуются. Имейте в виду, что все равно было бы меньше символов просто писать «inline» и «red» вместо «inherit».

Вот список свойств и независимо от того, делают они это автоматически: https://www.w3.org/TR/CSS21/propidx.html

1
ответ дан hydrix 20 August 2018 в 13:01
поделиться

Лучшее, что вы можете сделать, это

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>
13
ответ дан Igor Ivancha 20 August 2018 в 13:01
поделиться
  • 1
    Какова добавленная стоимость по сравнению с этим? .composite,.something { display:inline } и .composite,.else { background:red } – Pavel Gatnar 11 September 2015 в 19:58
  • 2
    @PavelGatnar Вы можете повторно использовать определения .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 '}';

...

-6
ответ дан john 20 August 2018 в 13:01
поделиться

Я понимаю, что этот вопрос сейчас очень старый, но здесь нет ничего!

Если целью является добавление одного класса, который подразумевает свойства нескольких классов, в качестве собственного решения, я бы рекомендовал использовать JavaScript / jQuery (jQuery действительно не обязательно, но, безусловно, полезно)

Если у вас есть, например, .umbrellaClass, который «наследует» от .baseClass1 и .baseClass2, у вас может быть какой-то JavaScript, который стреляет готов .

$(".umbrellaClass").addClass("baseClass1");
$(".umbrellaClass").addClass("baseClass2");

Теперь все элементы из .umbrellaClass будут иметь все свойства обоих .baseClass s. Обратите внимание, что, как и наследование ООП, .umbrellaClass может иметь или не иметь свои собственные свойства.

Единственное предостережение здесь состоит в том, чтобы рассмотреть, есть ли элементы, которые динамически создаются, которые не будут существовать, когда этот код срабатывает, но есть и другие способы.

Отстой Css не имеет нативного наследования.

7
ответ дан John Carrell 20 August 2018 в 13:01
поделиться

К сожалению, CSS не обеспечивает «наследование» так, как это делают языки программирования, такие как C ++, C # или Java. Вы не можете объявить класс CSS, а затем расширить его с помощью другого класса CSS.

Однако вы можете применить более одного класса к тегу в вашей разметке ... в этом случае есть сложный набор правил, определяющих, какие фактические стили будут применяться браузером.

<span class="styleA styleB"> ... </span>

CSS будет искать все стили, которые можно применить на основе вашей разметки, и объединить стили CSS из этих нескольких правил.

Как правило, стили сливаются, но когда возникают конфликты, более поздний объявленный стиль, как правило, выигрывает (если только важный атрибут не указан в одном из стилей, и в этом случае выигрывает). Кроме того, стили, применяемые непосредственно к элементу HTML, имеют приоритет над стилями класса CSS.

4
ответ дан LBushkin 20 August 2018 в 13:01
поделиться

Вы можете добавить несколько классов к одному элементу DOM, например

<div class="firstClass secondClass thirdclass fourthclass"></div>

Наследование не является частью стандарта CSS.

254
ответ дан Matt Bridges 20 August 2018 в 13:01
поделиться
  • 1
    знаете ли вы, какой класс преобладает, последние или первые, и является ли поведение браузера безопасным? Предположим, что .firstClass {font-size:12px;} .secondClass {font-size:20px;} окончательно font-size будет 12px или 20px и является ли этот кросс-браузер безопасным? – Marco Demaio 23 February 2012 в 21:17
  • 2
    Правило с наивысшей специфичностью на селекторе победит. Действуют стандартные правила специфики; в вашем примере, так как «первый» и "второй" имеют ту же специфичность, правило, объявленное позже в CSS, победит. – Matt Bridges 24 February 2012 в 05:31
  • 3
    Мне нравится идея использования чистого CSS (вместо LESS) для решения этой проблемы. – Alex 9 April 2013 в 12:50
  • 4
    Мне также нравится идея не печатать несколько классов несколько раз - что такое O (n ^ 2) work :) – Secret 11 January 2014 в 08:38
  • 5
    Что делать, если я использую стороннюю библиотеку и хочу изменить созданный ею проект / HTML, но не могу изменить встроенные файлы css в этой библиотеке? Там мне нужно какое-то наследование в классах css. – Shivam 4 February 2017 в 12:54

Less and Sass - предварительные процессоры CSS, которые расширяют язык CSS ценными способами. Только одно из многих улучшений, которые они предлагают, - это именно тот вариант, который вы ищете. Есть несколько очень хороших ответов с Less и я добавлю решение Sass.

У Sass есть опция расширения, которая позволяет одному классу полностью перейти на другой. Подробнее о расширении вы можете прочитать в этой статье

0
ответ дан Nesha Zoric 20 August 2018 в 13:01
поделиться

Вы можете достичь поведения, подобного наследованию, таким образом:

.p,.c1,.c2{...}//parent styles
.c1{...}//child 1 styles
.c2{...}//child 2 styles

См. http://jsfiddle.net/qj76455e/1/

Самое большое преимущество этого подхода - модульность - вы не создаете зависимости между классами (как это происходит, когда вы «наследуете» класс с использованием препроцессора). Поэтому любой запрос на изменение CSS не требует какого-либо большого анализа влияния.

0
ответ дан Pavel Gatnar 20 August 2018 в 13:01
поделиться
  • 1
    который не является наследованием, он применяет одни и те же стили к списку из трех классов, к которым вы впоследствии добавляете. Это может быть полезным решением в некоторых ситуациях. – Mousey 11 September 2015 в 19:08
  • 2
    @mousey precised – Pavel Gatnar 11 September 2015 в 19:15

Вы можете применить более одного класса CSS к элементу чем-то вроде этого класса = "something else"

3
ответ дан Pete 20 August 2018 в 13:01
поделиться

Для тех, кто не удовлетворен указанными (отличными) сообщениями, вы можете использовать свои навыки программирования, чтобы сделать переменную (PHP или любой другой), и хранить в ней несколько имен классов.

Это

<style>
.red { color: red; }
.bold { font-weight: bold; }
</style>

<? define('DANGERTEXT','red bold'); ?>

Затем примените глобальную переменную к желаемому элементу, а не к самим именам классов

<span class="<?=DANGERTEXT?>"> Le Champion est Ici </span>
1
ответ дан Shakir 20 August 2018 в 13:01
поделиться

Хотя прямое наследование невозможно.

Можно использовать класс (или 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 таким образом. (Например, изменение типов оформления текста).

1
ответ дан Stryderunknown 20 August 2018 в 13:01
поделиться

Элемент может принимать несколько классов:

.classOne { font-weight: bold; }
.classTwo { font-famiy:  verdana; }

<div class="classOne classTwo">
  <p>I'm bold and verdana.</p>
</div>

И это примерно так же близко, как вы к сожалению. Мне бы хотелось увидеть эту функцию вместе с классными псевдонимами.

47
ответ дан Willshaw Media 20 August 2018 в 13:01
поделиться

CSS действительно не делает то, что вы просите. Если вы хотите написать правила с этой сложной идеей, вы можете проверить compass . Это структура стилей, которая похожа на уже упомянутую «Меньшую».

Это позволяет вам делать миксины и весь этот хороший бизнес.

1
ответ дан Zack The Human 20 August 2018 в 13:01
поделиться
13
ответ дан Igor Ivancha 31 October 2018 в 10:27
поделиться
Другие вопросы по тегам:

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