簡體   English   中英

現在需要從另一個文件中調用類中的方法時,如何重寫該函數?

[英]How do I rewrite this function now that it needs to call upon a method in a class from a different file?

這是函數(在文件“ worldmodel.py”中):

def add_entity(world, entity):
   pt = entities.get_position(entity)
   if within_bounds(world, pt):
      old_entity = occ_grid.get_cell(world.occupancy, pt)
      if old_entity != None:
         entities.clear_pending_actions(old_entity)
      occ_grid.set_cell(world.occupancy, pt, entity)
      world.entities.append(entity)

這是名為“ occ_grid.py”的文件中的類:

class Grid:
   def __init__(self, width, height, occupancy_value):
      self.width = width
      self.height = height
      self.cells = []

      # initialize grid to all specified occupancy value
      for row in range(0, self.height):
         self.cells.append([])
         for col in range(0, self.width):
            self.cells[row].append(occupancy_value)

   def set_cell(self, point, value):
      self.cells[point.y][point.x] = value

我的問題是,我該如何重寫“ def add_entity”中引用“ set_cell”的代碼行? (現在,我已將set_cell設置為Grid類的方法)注:在將set_cell設置為Grid類的一部分之前,它是該類之外的一個函數(但仍與該類位於同一文件中)謝謝!

你需要import occ_gridworldmodel.py ,然后實例化一個Grid對象,並調用對象set_cell() -方法。 add_entity需要獲取Grid作為其參數,除非它可以隨意安全地實例化新對象。

這是一個天真的示例,該示例不起作用,但演示了我的意思:

import occ_grid

g = occ_grid.Grid(your_width, your_height, occupancy)

def add_entity(world, entity, grid):
    pt = entities.get_position(entity)
    if within_bounds(world, pt):
        old_entity = grid.get_cell(world.occupancy, pt)
        if old_entity != None:
            entities.clear_pending_actions(old_entity)
        grid.set_cell(world.occupancy, pt, entity)
        world.entities.append(entity)

add_entity(world, entity, g)

這里有兩個問題,(1)跨模塊調用函數,(2)調用類的方法。 看來您已經可以做到(1)。

訣竅在於,盡管方法定義為

 def methodName(self, ...)

他們被稱為

 object.methodName(...)

對象隱式地成為“自我”參數。 這是一個例子:

import occ_grid  # Import the module (file) that contains Grid.
   .
   .   
world.occupancy = occ_grid.Grid()  # Create an instance of Grid.
   .
   .
def add_entity(world, entity):
   pt = entities.get_position(entity)       
   .
   .   
   world.occupancy.set_cell(pt, entity)

在此示例中, grid是全局變量,可能不是一個好的設計。 我想這應該是world的財產,但這只是一個猜測。

除非使set_cell函數成為Grid類的靜態方法,否則將需要Grid 實例

from occ_grid import Grid

我將在此處進行假設,並說您希望網格成為世界的一部分? 無論哪種方式,這都是實例化該類的示例。

class World:
    grid = Grid()

    def add_entity(world, entity):
        # All that other stuff.
        world.grid.set_cell(pt, entity)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM