1

私はこのプログラムを作成しています。その機能の 1 つは、コンストラクターで初期化されたリストを出力することです。しかし、何が起こっているのかというと、メモリの場所を 16 進数などで出力しているのですが、その理由はわかりません。

2 つのクラスと実行クラスがあります。

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)

peoplelist の長さと while x < len(C2C.people) という条件を使用して while ループを作成したい場合は、そのバスに乗っているすべての人の名前をリスト y に追加します。

このような...

x = 0
y = []

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

しかし、私は結果としてこれを取得しています: フレッド [なし] ジェニファー [なし、なし]

4

3 に答える 3

5

まず、add2bus メソッドでバスを person として送信します。

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 が行うことです。したがって、print(self.name) を実行する代わりに、 people の get_name() メソッドでそれを返します。これで、上記のステートメントは文字列 self.name になります。

このような:

def get_name(self):
   return self.name

ループを実行したい場合は、期待どおりに動作するはずです。

さらに詳しく知りたい場合は、お知らせください。回答を更新します。

于 2013-07-11T21:45:26.893 に答える
3

関数 (またはステートメント、3.0 より前)を使用するとprint()、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 に答える