Какова цель внутренних классов Python?

Сначала отфильтруйте массив по датам, затем сопоставьте отфильтрованные элементы с требуемым форматом. Вы можете использовать деструктуризацию, чтобы сделать код короче:

const data = [{
    "score": "1200.65",
    "num_games": "160",
    "wins": "110",
    "year": "2013"
}, {
    "score": "705.23",
    "num_games": "34",
    "wins": "21",
    "year": "2014"
}, {
    "score": "467.12",
    "num_games": "77",
    "wins": "30",
    "year": "2015"
}];

const filterBy = (data, [min, max], prop) => data
  .filter(({ year }) => year >= min && year <= max)
  .map(({ year: x, [prop]: y }) => ({ x, y }));

console.log(filterBy(data, [2013, 2014], 'score'));
console.log(filterBy(data, [2013, 2013], 'wins'));

86
задан 2 revs, 2 users 100% 10 August 2016 в 21:47
поделиться

4 ответа

Заключенный в кавычки из http://www.geekinterview.com/question_details/64739:

Преимущества внутреннего класса:

  • Логическая группировка классов: Если класс полезен только для еще одного класса затем, логично встроить его в тот класс и держать два вместе. Вложение такие "классы помощника" делает их пакет более оптимизированным.
  • Увеличенная инкапсуляция: Рассмотрите два класса A верхнего уровня и B, где B нужен доступ к членам, который был бы иначе объявлен частный. Путем сокрытия класса B в классе A члены A могут быть объявлены частные, и B может получить доступ к ним. Кроме того, B самостоятельно может быть скрыт от внешнего мира.
  • Больше читаемого, удобного в сопровождении кода: Вложенные маленькие классы в классах верхнего уровня помещают код ближе туда, где он используется.

Основным преимуществом является организация. Что-либо, что может быть выполнено с внутренними классами, может быть выполнено без них.

78
ответ дан 2 revs 24 November 2019 в 08:01
поделиться

Есть ли что-то, что не может быть выполнено без них?

Нет. Они абсолютно эквивалентны определению класса обычно на верхнем уровне и затем копировании ссылки на него во внешний класс.

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

При поиске класса, который существует в течение жизненного цикла внешнего объектного / объектного владельца, и всегда имеет ссылку на экземпляр внешнего класса   —  inner классы, поскольку Java делает это  –   затем, вложенные классы Python не являются той вещью. Но можно изрубить что-то как эта вещь:

import weakref, new

class innerclass(object):
    """Descriptor for making inner classes.

    Adds a property 'owner' to the inner class, pointing to the outer
    owner instance.
    """

    # Use a weakref dict to memoise previous results so that
    # instance.Inner() always returns the same inner classobj.
    #
    def __init__(self, inner):
        self.inner= inner
        self.instances= weakref.WeakKeyDictionary()

    # Not thread-safe - consider adding a lock.
    #
    def __get__(self, instance, _):
        if instance is None:
            return self.inner
        if instance not in self.instances:
            self.instances[instance]= new.classobj(
                self.inner.__name__, (self.inner,), {'owner': instance}
            )
        return self.instances[instance]


# Using an inner class
#
class Outer(object):
    @innerclass
    class Inner(object):
        def __repr__(self):
            return '<%s.%s inner object of %r>' % (
                self.owner.__class__.__name__,
                self.__class__.__name__,
                self.owner
            )

>>> o1= Outer()
>>> o2= Outer()
>>> i1= o1.Inner()
>>> i1
<Outer.Inner inner object of <__main__.Outer object at 0x7fb2cd62de90>>
>>> isinstance(i1, Outer.Inner)
True
>>> isinstance(i1, o1.Inner)
True
>>> isinstance(i1, o2.Inner)
False

(Это использует декораторов класса, которые являются новыми в Python 2.6 и 3.0. Иначе необходимо было бы сказать “Внутренний = innerclass (Внутренний)” после определения класса.)

48
ответ дан 3 revs 24 November 2019 в 08:01
поделиться

Существует что-то, что необходимо перенести голову, чтобы смочь понять это. На большинстве языков определения классов являются директивами к компилятору. Таким образом, класс создается, прежде чем программа когда-либо запускается. В Python все операторы являются исполняемым файлом. Это означает что этот оператор:

class foo(object):
    pass

оператор, который выполняется во времени выполнения точно так же, как этот:

x = y + z

Это означает, что мало того, что можно создать классы в других классах, можно создать классы где угодно, Вы хотите. Рассмотрите этот код:

def foo():
    class bar(object):
        ...
    z = bar()

Таким образом идея "внутреннего класса" не является действительно конструкцией языка; это - конструкция программиста. У Guido есть очень хорошая сводка того, как это появилось здесь. Но по существу, основная идея, это упрощает грамматику языка.

27
ответ дан Jason Baker 24 November 2019 в 08:01
поделиться

Вложенные классы в классах:

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

  • Вложенные классы могут создать связь, которая сделала бы тестирование более трудным.

  • В Python можно поместить больше чем один класс в файл/модуль, в отличие от Java, таким образом, класс все еще остается рядом с высокоуровневым классом и мог даже снабдить префиксом имя класса "_", чтобы помочь показать, что другие не должны использовать его.

Место, где вложенные классы могут оказаться полезными, в функциях

def some_func(a, b, c):
   class SomeClass(a):
      def some_method(self):
         return b
   SomeClass.__doc__ = c
   return SomeClass

Класс получает значения от функции, разрешающей Вам динамично создать класс как шаблонное метапрограммирование в C++

13
ответ дан 2 revs 24 November 2019 в 08:01
поделиться
Другие вопросы по тегам:

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