В Python существует различие между [1 111], связал , и развязал методы.
В основном, вызов к функции членства (как method_one
), связанная функция
a_test.method_one()
переводится в [1 115]
Test.method_one(a_test)
т.е. вызов к несвязанному методу. Из-за этого вызов к Вашей версии method_two
перестанет работать с TypeError
>>> a_test = Test()
>>> a_test.method_two()
Traceback (most recent call last):
File "", line 1, in
TypeError: method_two() takes no arguments (1 given)
, можно изменить поведение метода с помощью декоратора
class Test(object):
def method_one(self):
print "Called method_one"
@staticmethod
def method_two():
print "Called method two"
, декоратор говорит встроенный метакласс type
по умолчанию (класс класса, cf. этот вопрос ) для не создания связанных методов для method_two
.
Теперь, можно вызвать статический метод оба на экземпляр или на класс непосредственно:
>>> a_test = Test()
>>> a_test.method_one()
Called method_one
>>> a_test.method_two()
Called method_two
>>> Test.method_two()
Called method_two
DCG используют как унификацию, так и отслеживание с возвратом, поэтому не избежать реализации ядра Prolog. То есть, вы можете представить любую программу на чистом Prolog как DCG, анализирующую пустой список.
Вы можете сделать это, если вас интересует только какой-то особый случай DCG, например, без переменных (подходит только для распознавания, но не для анализа).