Мне трудно понять строку документации класса Agent в следующем коде:
source: AIMA Repository - Python, agents.py module
class Agent(Thing):
"""An Agent is a subclass of Thing with one required slot,
.program, which should hold a function that takes one argument, the
percept, and returns an action. (What counts as a percept or action
will depend on the specific environment in which the agent exists.)
Note that 'program' is a slot, not a method. If it were a method,
then the program could 'cheat' and look at aspects of the agent.
It's not supposed to do that: the program can only look at the
percepts. An agent program that needs a model of the world (and of
the agent itself) will have to build and maintain its own model.
There is an optional slot, .performance, which is a number giving
the performance measure of the agent in its environment."""
def __init__(self, program=None):
self.alive = True
self.bump = False
self.holding = []
self.performance = 0
if program is None or not isinstance(program, collections.abc.Callable):
print("Can't find a valid program for {}, falling back to default.".format(self.__class__.__name__))
def program(percept):
return eval(input('Percept={}; action? '.format(percept)))
self.program = program
def can_grab(self, thing):
"""Return True if this agent can grab this thing.
Override for appropriate subclasses of Agent and Thing."""
return False
Строка do c говорит, что program и performance являются слотами, и эта программа определена таким образом, чтобы предотвратить cheat, исходя из моего понимания, для того, чтобы у класса были слоты, должен быть определен атрибут с именем __slots__
. но это не тот случай, и даже если бы это было так, целью слота является увеличение времени доступа и уменьшение использования памяти, а не предотвращение мошенничества.
Также, если инкапсуляция предназначена для предотвращения мошенничества, то это все равно не имеет смысла, поскольку Python не имеет эффективного механизма ограничения доступа к переменным класса.
Я понимаю, что программа должна быть определена как функция (а не метод) , так что разные агенты могут иметь разные программы, поэтому:
- Действительно ли термин «слот» используется для передачи этого значения?
- Если это так, это правильно? использование слова 'slot'?
- self не передается программе , если она определена как функция, поэтому она не может обмануть?