当我尝试将我的对象放入列表时,我无法获得带有对象名称的输出,它给出了一个奇怪的输出,如“_ 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。
你需要为你的类__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
将__str()__
魔术方法添加到您的汽车类中,如下所示:
def __str__(self):
return f'car with x of {self.x}, y of {self.y}, and type of {self.car_type}'