1

我正在创建这个程序,它的功能之一是输出一个在构造函数中初始化的列表。但是,发生的事情是它以十六进制或其他形式输出内存位置,我不知道为什么。

我有两个班级和一个跑步班:

class Person :
def __init__(self, name, ID, age, location, destination):
    self.name = name
    self.ID = ID
    self.age = age
    self.location = location
    self.destination = destination


def introduce_myself(self):
    print("Hi, my name is " + self.name + " , my ID number is " + str(self.ID) + " I am " + str(self.age) + " years old")

def get_route(self):
    return self.location + self.destination


def add2bus(self, Bus):
    if Person.get_route(self) == Bus.get_route() :
        Bus.get_on(Bus)

    else :
        print("not compatible")

def get_name(self):
   print(self.name)

import People

class Bus :
def __init__(self, name, capacity, location, destination):
    self.bus_name = name
    self.bus_capacity = capacity
    self.bus_location = location
    self.bus_destination = destination
    self.seats = []
    self.people = []


def Bus_properties(self):
    print(self.bus_name + ", " + str(self.bus_capacity) + ", " + self.bus_location + ", " + self.bus_destination)

def print_list(self):
    a = self.people
    print(self.people)

def get_route(self):
    return self.bus_location + self.bus_destination

def get_on(self, Person):
    if len(self.people) < 20: #Loop through all the seats
        self.people.append(Person)
    else:
        print('fulll')

def get_name(self):
    print(self.name)



import People
import Transport

C2C = Transport.Bus("C2C", 30, "Ithaca", "New York")
Fred = People.Person("Fred", 12323, 13, "Ithaca", "New York")
Jennifer = People.Person("Jennifer", 111117, 56, "Ithaca", "New York")

Fred.add2bus(C2C)
Jennifer.add2bus(C2C)

我想创建一个 while 循环,它采用 peoplelist 的长度和条件 while x < len(C2C.people) 然后它将该公共汽车上的所有人员姓名附加到列表 y

像这样...

x = 0
y = []

while x < len(C2C.people) :
    y.append((C2C.people[x].get_name()))
    x = x + 1
    print(y)

但我得到了这个结果:Fred [None] Jennifer [None, None]

4

3 回答 3

5

首先,您将作为 add2bus 方法中的人员发送总线。

def add2bus(self, Bus):
        if Person.get_route(self) == Bus.get_route() :
            Bus.get_on(Bus)

        else :
            print("not compatible")

所以这会将C2C作为总线对象,然后调用C2C.get_on(C2C)

相反,你想做:

Bus.get_on(self)

然后要得到这个人的名字,你可以这样做。

C2C.people[0].get_name(). 

调用它会打印乘客的姓名,但您要做的是将乘客的姓名作为字符串返回,这就是 return 所做的。所以在人们的 get_name() 方法中,而不是做 print(self.name),返回它。现在上面的语句将变成字符串 self.name。

像这样:

def get_name(self):
   return self.name

当你想做你的循环时,它应该像你现在所期望的那样工作。

如果您想让我更详细地介绍,请告诉我,我会更新我的答案。

于 2013-07-11T21:45:26.893 回答
3

当您使用该print()函数(或语句,3.0 之前的版本)时,python 要求您正在打印的对象将自己转换为字符串;通过__str__函数。由于object为您定义了此方法,因此它始终有效;但是预定义的版本不是很有帮助(以您所看到的方式)。

提供你自己的。它不接受任何参数并且必须返回一个字符串:

class Foo: 
    bar = 'baz'

    def __str__(self):
        return "Friendly Foo Description: " + bar
于 2013-07-11T21:32:43.203 回答
2

正如@inspectorG4dget 所说,定义一个__str__方法来覆盖打印的内容。

>>> class A(object):
...     pass
...
>>> print(A())
<__main__.A object at 0x10ca829d0>
>>>
>>> class B(object):
...     def __str__(self):
...             return "I am a B"
...
>>> print(B())
I am a B
于 2013-07-11T21:32:58.597 回答