![](/img/trans.png)
[英]If a function (that's outside of the class) needs to use a method from a class, how do I call the method?
[英]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_grid
在worldmodel.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.