【问题标题】:Python instance reference accessing methodPython实例引用访问方法
【发布时间】:2013-04-03 19:51:32
【问题描述】:

我是编程新手,如果这很明显,请多多包涵。

我在同一个 *.py 文件中有两个类。 sn-ps 如下。我正在尝试与客户一起模拟电梯,并且在主程序中我将创建 n 个客户。我希望电梯类中的方法,称为 startLift 能够访问客户的各个实例,但我不确定如何做到这一点,所以如果我遍历我的客户,在每次迭代时调用 startLift,我该怎么做所以它引用了这个实例。

提前谢谢你。

类电梯:

def __init__(self):

    self.stops = building.getFloors(redbrick)

    if self.stops <1:
        print "elevator out of bounds"
    else:
        print "elevator has ",building.getFloors(redbrick),"stops"

我尝试改写问题:

self.stops = building.getFloors(redbrick)

我在电梯类中调用 building 方法,因此建筑物将有关它可以行驶多少层的信息传递给电梯类。

"redbrick" 是 buliding 类的一个实例,为了使其工作 "building.getfloors() ,我必须传递一个建筑实例,否则我会得到 ​​p>

“必须调用未绑定的方法 getFloors(),并将构建实例作为第一个参数(什么都没有)”

但是如果我创建它,我如何将建筑物的多个实例传递给“building.getfloors()”,例如

白砖=建筑()

红砖=建筑()

黄砖=建筑()

【问题讨论】:

  • 您似乎混淆了静态方法和实例方法。特别是customer.getLocation(users)。您可能希望将customer 的实例传递给startLift
  • 谢谢你回来找我,也许我没有正确解释这个问题,但你在回复中所说的关于将客户实例传递给启动电梯,我该怎么做 customer.getLocation (用户),在这种情况下,“用户”是客户类的一个实例,但如果制作该类的多个实例,我如何让它引用 customer.getlocaton()
  • elevatorcustomer 都是类。但是,您希望创建每个类的实例。如果您在此处添加完整代码会更容易为您提供帮助,因为此代码需要进行一些重大更改才能正常工作。
  • 此外,您的命名约定使这更难理解。每次您提到“客户”时,我们都无法判断您是指类客户、类的实例还是用于实例化类客户的参数。也许重命名类“客户”和参数“客户名称”或任何它应该是的。

标签: python instance pass-by-reference


【解决方案1】:

我将通过不实际回答此答案中的问题来打破 SO 的基本规则,但它太长了,无法发表评论。

部分问题似乎是对类和实例如何与 python 一起工作或在一般编程中的误解(这没有什么问题,我们都在某个时候学习)。因此,您的问题是有效的,但提出的很尴尬,所以让我们退后一步。

您当前的电梯 init() 方法并没有像描述的那样真正工作。为了进入大楼,您必须将其交给电梯的 init()。例如,您的 Building 和 Elevator 类(我用大写表示它是一个类,而不是该类的实例)可能如下所示:

class Building:
    def __init__(self, floors=1, color=None):
        self.floors = floors
        self.color = color

    def getFloors(self):
        return self.floors


class Elevator:
    def __init__(self, building):
        self.stops = building.getFloors()
        self.current_floor = 1

然后,在您的主程序中,您将拥有如下内容:

redbrick = Building(floors=4, color='red')
redbrick_elevator = Elevator(redbrick)

注意我的大写约定——building 是电梯的 init() 方法的一个参数,并且是 Building 类的一个实例。当我调用 getFloors() 方法时,它是在实例而不是类上调用的,并且实例 redbrick 作为 self 自动传递给 getFloors()。

现在,您的旧(预编辑)客户类很好(但我会称之为客户)。但是调用电梯的方法是行不通的,因为客户没有被传递进来。所以,例如,你可能有这样的事情:

class Elevator:
    def __init__(self, building):
        self.stops = building.getFloors()
        self.current_floor = 1
        self.customer_list = []
        self.stop_list = []

    def getCurrentFloor(self):
        return self.current_floor

    def callElevator(self, floor):
        self.stop_list.append(floor)

    def getOn(self, customer):
        self.customer_list.append(customer)
        self.stop_list.append(customer.getEndFloor())

    def letOff(self):
        for customer in self.customer_list[:]:
            if self.current_floor == customer.getEndFloor():
                self.customer_list.remove(customer)

...

希望这足以让您入门,包括一些关于类和实例如何在 python 中工作的想法,以及一种存储不同类实例之间关系的简单方法。

【讨论】:

  • 如果您对答案感到满意,您应该点击复选标记接受它:) 欢迎来到 SO!
猜你喜欢
  • 2018-02-24
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2017-03-20
  • 2015-07-09
  • 1970-01-01
  • 2017-10-12
相关资源
最近更新 更多