Python, почему объект, который, кажется, не существует, доступен? - PullRequest
0 голосов
/ 24 сентября 2019

На этапе самоанализа некоторых объектов в коде Python в одном случае я не понимаю результат.Вот фрагмент кода ниже:

def list_outputs(self):
    super(Input_Filter, self).list_outputs() 

    print('\n This is self: ', self)        # added for introspection
    for i in sorted(dir(self)):              # added for introspection
            print('- ', i)                   # added for introspection

    print('\n This is self.project: ', self.project)  # added for introspection
        for i in sorted(dir(self.project)):            # added for introspection
            print('- ', i)                             # added for introspection

Полученный результат:

Это self:

<mia_processes.tools.tools.Input_Filter object at 0x7fc22f072db0>

-  \__base_traits__
-  \__call__
-  \__class_traits__
-  \__deepcopy__
-  \__dir__
-  \__doc__
-  \__getstate__
-  \__init__
-  \__init__
-  \__instance_traits__
-  \__listener_traits__
-  \__module__
-  \__prefix_trait__
-  \__prefix_traits__
-  \__reduce_ex__
-  \__setstate__
-  \__view_traits__
-  _after_run_process
-  _before_run_process
-  _clone_trait
-  _each_trait_method
-  _filter
-  _flush_traits_cache
-  _get_instance_handlers
-  _get_log
-  _get_sync_trait_info
-  _init_trait_delegate_listener
-  _init_trait_event_listener
-  _init_trait_listeners
-  _init_trait_method_listener
-  _init_trait_property_listener
-  _instance_changed_handler
-  _is_list_trait
-  _list_changed_handler
-  _list_items_changed_handler
-  _on_trait_change
-  _post_init_trait_listeners
-  _propagate_optional_parameter
-  _remove_trait_delegate_listener
-  _rst_table
-  _run_process
-  _set_traits_cache
-  _sync_trait_items_modified
-  _sync_trait_modified
-  _trait_added_changed
-  _trait_delegate_name
-  _trait_listener
-  _user_traits
-  add_trait
-  add_trait_listener
-  all_trait_names
-  base_trait
-  change_dir
-  clone_traits
-  configure_traits
-  context_name
-  copy
-  copy_traits
-  copyable_trait_names
-  default_traits_view
-  default_values
-  edit_traits
-  editable_traits
-  export_to_dict
-  get
-  get_brick_to_update
-  get_commandline
-  get_help
-  get_input_help
-  get_input_spec
-  get_inputs
-  get_log
-  get_missing_mandatory_parameters
-  get_output_help
-  get_output_spec
-  get_outputs
-  get_parameter
-  get_scan_bricks
-  get_study_config
-  has_traits_interface
-  id
-  import_from_dict
-  input
-  is_user_trait
-  list_outputs
-  list_outputs
-  log_file
-  make_commandline_argument
-  make_initResult
-  manage_brick_after_run
-  manage_brick_before_run
-  manage_brick_output_after_run
-  manage_brick_output_before_run
-  manage_matlab_launch_parameters
-  mfile
-  name
-  on_trait_change
-  on_trait_event
-  output
-  output_directory
-  print_traits
-  remove_brick_output
-  remove_trait
-  remove_trait_listener
-  reorder_traits
-  requirement
-  reset_traits
-  run
-  run_process_mia
-  run_process_mia
-  save_log
-  set
-  set_parameter
-  set_study_config
-  study_config
-  switch_to_cur_work_dir
-  switch_to_scripts_dir
-  sync_trait
-  trait
-  trait_added
-  trait_context
-  trait_get
-  trait_modified
-  trait_names
-  trait_set
-  trait_setq
-  trait_view
-  trait_view_elements
-  trait_views
-  traits
-  user_traits
-  user_traits_changed
-  validate_trait
-  versions
-  visible_traits

Это self.project:

<populse_mia.data_manager.project.Project object at 0x7fc22f09f400>
-  _Database__create_empty_schema
-  _Database__db_file
-  _Database__scoped_session
-  \__class__
-  \__delattr__
-  \__dict__
-  \__dir__
-  \__doc__
-  \__enter__
-  \__eq__
-  \__exit__
-  \__format__
-  \__ge__
-  \__getattribute__
-  \__gt__
-  \__hash__
-  \__init__
-  \__init_subclass__
-  \__le__
-  \__lt__
-  \__module__
-  \__ne__
-  \__new__
-  \__reduce__
-  \__reduce_ex__
-  \__repr__
-  \__setattr__
-  \__sizeof__
-  \__str__
-  \__subclasshook__
-  \__weakref__
-  caches
-  clear
-  engine
-  list_tables
-  query_type
-  string_engine

В объекте self, похоже, нет объекта project.

Так почему self.project существует ???

1 Ответ

0 голосов
/ 24 сентября 2019

В большинстве случаев атрибуты self ищутся в атрибуте self.__dict__, который является обычным диктом, содержащим значения и функции.Таким образом, self.project эквивалентен ( в большинстве случаев ) self.__dict__['project'].

Если он не найден, он ищется в __dict__ класса selfи в суперклассах.Кроме того, дескрипторы могут изменить способ поиска.

...