Как сделать эту грамматику LL (1)

Q: «Есть ли способ установить атрибут для метода таким образом, чтобы он существовал только в одном экземпляре, а не для каждого экземпляра класса?»

A: Да:

class c:

    def m(self):

        print(type(c.m))
        setattr(c.m, 'i', 0)

        print(type(self))
        setattr(self, 'i', 0)

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

Но методы имеют связанный с ними экземпляр объекта (self). Следовательно, вам не нужно устанавливать атрибуты метода, так как вы просто можете установить его на экземпляр вместо этого. Это действительно то, для чего предназначен экземпляр.

Сообщение, на которое вы ссылаетесь, показывает, как создать функцию со статической переменной. Я бы сказал, что в Python это будет ошибочным. Вместо этого посмотрите на этот ответ: Что такое эквивалент Python для статических переменных внутри функции?

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

0
задан rici 19 March 2019 в 15:08
поделиться

2 ответа

Поскольку этот язык является регулярным (a; | a(;a)+;?), то да, это было бы возможно.

Не уверен, что я использую правильный синтаксис, но язык в основном a; (используется A-> B) или любая строка, которая начинается с a, за которой следует одна или несколько пар ;a, опционально добавив еще один ; в конце.

0
ответ дан Scott Hunter 19 March 2019 в 15:08
поделиться

Это та же самая грамматика, но проще: A -> a | ';' | ';' A

Это все еще не LL (1). Но, удаляя левый фактор, теперь это LL (1): A -> a B B -> ε | ';' C C -> ε | A

0
ответ дан Pablo Menendez 19 March 2019 в 15:08
поделиться
Другие вопросы по тегам:

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