如何将我的对象添加到列表中以随机选择它们以显示在屏幕上?

问题描述 投票:1回答:2

当我尝试将我的对象放入列表时,我无法获得带有对象名称的输出,它给出了一个奇怪的输出,如“_ main _.object at 0x029E7210”。我想随机选择我的对象,将其中一个对象插入到屏幕上。但我无法弄清楚这一点。

car_main = pygame.image.load("car_main.png")
car_red_ = pygame.image.load("car_red.png")
car_blue = pygame.image.load("car_blue.png")

class cars:

    def __init__(self,x,y,car_type,w=50,h=100,s=5):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.s = s
        self.car_type = car_type

    def draw(self):
        dp.blit(self.car_type,(self.x,self.y))

car1 = cars(x,y,car_main)
car2 = cars(x,y,car_red)
car3 = cars(x,y,car_blue)
car_list = [car1,car2,car3]
rc = random.choice(car_list)
print(rc)

# output>  __main__.object at 0x02A97230

当我改变

car_list = [car1,car2,car3] with;
car_list = [car1.car_type,car2.car_type,car3.car_type]

# output > Surface(50x100x32 SW)

但我希望看到输出作为我的对象名称。不是字符串类型(“car_main”)。我想直接获得输出作为对象名称(car_main)。因为在主循环中,每当循环更新时,我将选择其中一个在屏幕上进行blit。

python
2个回答
2
投票

你需要为你的类__str__定义Car,让它正确处理对象到字符串:

class Car:

    def __str__(self):
        for k, var in globals().items():
            if var == self:
                return k
        # default
        return "Car"

注1:通常使用大写的Car作为一个类,使用car作为实例。


注意2:在globals中查找变量字符串是不可靠的。您可能不希望将所有变量设置为全局变量,并且在范围内手动搜索它们是繁琐的。实际上你为什么不给你的Car一个name属性?那你很好:

class Car:

    def __init__(self, name):
        self.name=name

    def __str__(self):
        return self.name

car = Car(name='first car')
print(car) # 'first car'

更多关于“魔法”的解读:https://rszalski.github.io/magicmethods/#representations


0
投票

__str()__魔术方法添加到您的汽车类中,如下所示:

def __str__(self):
    return f'car with x of {self.x}, y of {self.y}, and type of {self.car_type}'
© www.soinside.com 2019 - 2024. All rights reserved.