本文整理汇总了Python中horizons.util.python.weakmethodlist.WeakMethodList类的典型用法代码示例。如果您正苦于以下问题:Python WeakMethodList类的具体用法?Python WeakMethodList怎么用?Python WeakMethodList使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了WeakMethodList类的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: move
def move(self, destination, callback=None, destination_in_building=False, action='move',
blocked_callback=None, path=None):
"""Moves unit to destination
@param destination: Point or Rect
@param callback: a parameter supported by WeakMethodList. Gets called when unit arrives.
@param action: action as string to use for movement
@param blocked_callback: a parameter supported by WeakMethodList. Gets called when unit gets blocked.
@param path: a precalculated path (return value of FindPath()())
"""
if not path:
# calculate the path
move_possible = self.path.calc_path(destination, destination_in_building)
self.log.debug("%s: move to %s; possible: %s; is_moving: %s", self,
destination, move_possible, self.is_moving())
if not move_possible:
raise MoveNotPossible
else:
self.path.move_on_path(path, destination_in_building=destination_in_building)
self.move_callbacks = WeakMethodList(callback)
self.blocked_callbacks = WeakMethodList(blocked_callback)
self._conditional_callbacks = {}
self._setup_move(action)
# start moving by regular ticking (only if next tick isn't scheduled)
if not self.is_moving():
self.__is_moving = True
# start moving in 1 tick
# this assures that a movement takes at least 1 tick, which is sometimes subtly
# assumed e.g. in the collector code
Scheduler().add_new_object(self._move_tick, self)
示例2: __init
def __init(self):
self.__listeners = WeakMethodList()
self.__remove_listeners = WeakMethodList()
# number of event calls
# if any event is triggered increase the number, after all callbacks are executed decrease it
# if it reaches 0 it means that in the current object all event callbacks were executed
self.__event_call_number = 0
self.__hard_remove = True
示例3: __init
def __init(self, x, y):
self.position = Point(x, y)
self.last_position = Point(x, y)
self._next_target = Point(x, y)
self.move_callbacks = WeakMethodList()
self.blocked_callbacks = WeakMethodList()
self._conditional_callbacks = {}
self.__is_moving = False
self.path = self.pather_class(self, session=self.session)
self._exact_model_coords = fife.ExactModelCoordinate() # save instance since construction is expensive (no other purpose)
self._fife_location = None
示例4: stop
def stop(self, callback=None):
"""Stops a unit with currently no possibility to continue the movement.
The unit actually stops moving when current move (to the next coord) is finished.
@param callback: a parameter supported by WeakMethodList. is executed immediately if unit isn't moving
"""
if not self.is_moving():
WeakMethodList(callback).execute()
return
self.move_callbacks = WeakMethodList(callback)
self.path.end_move()
示例5: ChangeListener
class ChangeListener(object):
"""Trivial ChangeListener.
The object that changes and the object that listens have to inherit from this class.
An object calls _changed everytime something has changed, obviously.
This function calls every Callback, that has been registered to listen for a change.
NOTE: ChangeListeners aren't saved, they have to be reregistered on load
NOTE: RemoveListeners must not access the object, as it is in progress of being destroyed.
"""
def __init__(self, *args, **kwargs):
super(ChangeListener, self).__init__()
self.__init()
def __init(self):
self.__listeners = WeakMethodList()
self.__remove_listeners = WeakMethodList()
# number of event calls
# if any event is triggered increase the number, after all callbacks are executed decrease it
# if it reaches 0 it means that in the current object all event callbacks were executed
self.__event_call_number = 0
self.__hard_remove = True
def __remove_listener(self, listener_list, listener):
# check if the listener should be hard removed
# if so switch it in the list to None
try:
if self.__hard_remove:
listener_list.remove(listener)
else:
listener_list[listener_list.index(listener)] = None
except ValueError as e: # nicer error:
raise ValueError(str(e)+
"\nTried to remove: "+str(listener)+"\nat "+str(self)+
"\nList: "+str([str(i) for i in listener_list]))
def __call_listeners(self, listener_list):
# instead of removing from list, switch the listener in position to None
# this way, iteration won't be affected while listeners may modify the list
self.__hard_remove = False
# increase the event call number
self.__event_call_number += 1
for listener in listener_list:
if listener:
try:
listener()
except ReferenceError as e:
# listener object is dead, don't crash since it doesn't need updates now anyway
print 'Warning: the dead are listening to', self, ': ', e
traceback.print_stack()
self.__event_call_number -= 1
if self.__event_call_number == 0:
self.__hard_remove = True
listener_list[:] = [ l for l in listener_list if l ]
## Normal change listener
def add_change_listener(self, listener, call_listener_now=False, no_duplicates=False):
assert callable(listener)
if not no_duplicates or listener not in self.__listeners:
self.__listeners.append(listener)
if call_listener_now: # also call if duplicate is adde
listener()
def remove_change_listener(self, listener):
self.__remove_listener(self.__listeners, listener)
def has_change_listener(self, listener):
return (listener in self.__listeners)
def discard_change_listener(self, listener):
"""Remove listener if it's there"""
if self.has_change_listener(listener):
self.remove_change_listener(listener)
def clear_change_listeners(self):
"""Removes all change listeners"""
self.__listeners = WeakMethodList()
def _changed(self):
"""Calls every listener when an object changed"""
self.__call_listeners(self.__listeners)
## Removal change listener
def add_remove_listener(self, listener, no_duplicates=False):
"""A listener that listens for removal of the object"""
assert callable(listener)
if no_duplicates and listener in self.__remove_listeners:
return # don't allow duplicate entries
self.__remove_listeners.append(listener)
def remove_remove_listener(self, listener):
self.__remove_listener(self.__remove_listeners, listener)
def has_remove_listener(self, listener):
return (listener in self.__remove_listeners)
def discard_remove_listener(self, listener):
if self.has_remove_listener(listener):
self.remove_remove_listener(listener)
#.........这里部分代码省略.........
示例6: clear_change_listeners
def clear_change_listeners(self):
"""Removes all change listeners"""
self.__listeners = WeakMethodList()
示例7: MovingObject
class MovingObject(ComponentHolder, ConcreteObject):
"""This class provides moving functionality and is to be inherited by Unit.
Its purpose is to provide a cleaner division of the code.
It provides:
*attributes:
- position, last_position: Point
- path: Pather
*moving methods:
- move
- stop
- add_move_callback
*getters/checkers:
- check_move
- get_move_target
- is_moving
"""
movable = True
log = logging.getLogger("world.units")
# overwrite this with a descendant of AbstractPather
pather_class = None # type: Type[AbstractPather]
def __init__(self, x, y, **kwargs):
super().__init__(x=x, y=y, **kwargs)
self.__init(x, y)
def __init(self, x, y):
self.position = Point(x, y)
self.last_position = Point(x, y)
self._next_target = Point(x, y)
self.move_callbacks = WeakMethodList()
self.blocked_callbacks = WeakMethodList()
self._conditional_callbacks = {}
self.__is_moving = False
self.path = self.pather_class(self, session=self.session)
self._exact_model_coords1 = fife.ExactModelCoordinate() # save instance since construction is expensive (no other purpose)
self._exact_model_coords2 = fife.ExactModelCoordinate() # save instance since construction is expensive (no other purpose)
self._fife_location1 = None
self._fife_location2 = None
def check_move(self, destination):
"""Tries to find a path to destination
@param destination: destination supported by pathfinding
@return: object that can be used in boolean expressions (the path in case there is one)
"""
return self.path.calc_path(destination, check_only=True)
def is_moving(self):
"""Returns whether unit is currently moving"""
return self.__is_moving
def stop(self, callback=None):
"""Stops a unit with currently no possibility to continue the movement.
The unit actually stops moving when current move (to the next coord) is finished.
@param callback: a parameter supported by WeakMethodList. is executed immediately if unit isn't moving
"""
if not self.is_moving():
WeakMethodList(callback).execute()
return
self.move_callbacks = WeakMethodList(callback)
self.path.end_move()
def _setup_move(self, action='move'):
"""Executes necessary steps to begin a movement. Currently only the action is set."""
# try a number of actions and use first existent one
for action_iter in (action, 'move', self._action):
if self.has_action(action_iter):
self._move_action = action_iter
return
# this case shouldn't happen, but no other action might be available (e.g. ships)
self._move_action = 'idle'
def move(self, destination, callback=None, destination_in_building=False, action='move',
blocked_callback=None, path=None):
"""Moves unit to destination
@param destination: Point or Rect
@param callback: a parameter supported by WeakMethodList. Gets called when unit arrives.
@param action: action as string to use for movement
@param blocked_callback: a parameter supported by WeakMethodList. Gets called when unit gets blocked.
@param path: a precalculated path (return value of FindPath()())
"""
if not path:
# calculate the path
move_possible = self.path.calc_path(destination, destination_in_building)
self.log.debug("%s: move to %s; possible: %s; is_moving: %s", self,
destination, move_possible, self.is_moving())
if not move_possible:
raise MoveNotPossible
else:
self.path.move_on_path(path, destination_in_building=destination_in_building)
#.........这里部分代码省略.........
示例8: MovingObject
class MovingObject(ComponentHolder, ConcreteObject):
"""This class provides moving functionality and is to be inherited by Unit.
Its purpose is to provide a cleaner division of the code.
It provides:
*attributes:
- position, last_position: Point
- path: Pather
*moving methods:
- move
- stop
- add_move_callback
*getters/checkers:
- check_move
- get_move_target
- is_moving
"""
movable = True
log = logging.getLogger("world.units")
pather_class = None # overwrite this with a descendant of AbstractPather
def __init__(self, x, y, **kwargs):
super(MovingObject, self).__init__(x=x, y=y, **kwargs)
self.__init(x, y)
def __init(self, x, y):
self.position = Point(x, y)
self.last_position = Point(x, y)
self._next_target = Point(x, y)
self.move_callbacks = WeakMethodList()
self.blocked_callbacks = WeakMethodList()
self._conditional_callbacks = {}
self.__is_moving = False
self.path = self.pather_class(self, session=self.session)
self._exact_model_coords = fife.ExactModelCoordinate() # save instance since construction is expensive (no other purpose)
self._fife_location = None
def check_move(self, destination):
"""Tries to find a path to destination
@param destination: destination supported by pathfinding
@return: object that can be used in boolean expressions (the path in case there is one)
"""
return self.path.calc_path(destination, check_only = True)
def is_moving(self):
"""Returns whether unit is currently moving"""
return self.__is_moving
def stop(self, callback=None):
"""Stops a unit with currently no possibility to continue the movement.
The unit actually stops moving when current move (to the next coord) is finished.
@param callback: a parameter supported by WeakMethodList. is executed immediately if unit isn't moving
"""
if not self.is_moving():
WeakMethodList(callback).execute()
return
self.move_callbacks = WeakMethodList(callback)
self.path.end_move()
def _setup_move(self, action='move'):
"""Executes necessary steps to begin a movement. Currently only the action is set."""
# try a number of actions and use first existent one
for action_iter in (action, 'move', self._action):
if self.has_action(action_iter):
self._move_action = action_iter
return
# this case shouldn't happen, but no other action might be available (e.g. ships)
self._move_action = 'idle'
def move(self, destination, callback=None, destination_in_building=False, action='move',
blocked_callback=None, path=None):
"""Moves unit to destination
@param destination: Point or Rect
@param callback: a parameter supported by WeakMethodList. Gets called when unit arrives.
@param action: action as string to use for movement
@param blocked_callback: a parameter supported by WeakMethodList. Gets called when unit gets blocked.
@param path: a precalculated path (return value of FindPath()())
"""
if not path:
# calculate the path
move_possible = self.path.calc_path(destination, destination_in_building)
self.log.debug("%s: move to %s; possible: %s; is_moving: %s", self,
destination, move_possible, self.is_moving())
if not move_possible:
raise MoveNotPossible
else:
self.path.move_on_path(path, destination_in_building=destination_in_building)
self.move_callbacks = WeakMethodList(callback)
self.blocked_callbacks = WeakMethodList(blocked_callback)
#.........这里部分代码省略.........