#python #oop
#python #ооп
Вопрос:
Я хочу перечислить объекты по его атрибуту и получить его только с теми атрибутами, которые есть в списке.
class foo:
def __init__(self,id):
self.id=id
a=foo(0)
b=foo(1)
ids=[a.id,b.id]
могу ли я ссылаться a
только на наличие ids
?
и если это невозможно таким образом, как я могу?
Комментарии:
1. Почему бы здесь не использовать словарь?
2. вы правы. но это пример для демонстрации. Я буду использовать несколько атрибутов.
3.Ключами будут
id
s, значения могут быть любыми, какими они вам нужны (т. Е.foo
Объектами). Пока объекты находятся в dict, вы всегда можете легко выполнить поиск.4. да, я понял. но мне просто интересно, есть ли какой-нибудь способ сделать это так, как я хочу? например, получить игрока, который выпустил пулю? без добавления маркера в словарь и маркировки его стрелка
5. Это можно сделать и другими способами, например, если вы храните все свои
foo
объекты в alist
, а затем просматриваете список, но здесь это кажется менее логичным. Вы также можете потенциально использоватьlocals()
— но не делайте этого. Для этого просто используйте словарь.
Ответ №1:
Пользователь словарь:
class foo:
def __init__(self,id):
self.id=id
a=foo(0)
b=foo(1)
ids={a.id:a, b.id:b}
print(ids[0])
Пример без словаря
ПРИМЕЧАНИЕ: Это может быть лучше достигнуто с помощью метапрограммирования на Python, и может показаться, что ваш вопрос может иметь реальное применение в реальном мире при создании пакетов Python, фреймворков и т. Д.
Тем не менее, неуклюжим способом это достигается.
import random
class foo:
def __init__(self,id):
self.id=id
def create_counter():
count = 0
def internal():
nonlocal count
count = 1
return count
return internal
counter = create_counter()
def create_id():
"""Generate random id, uses a stateles Closure to keep track of counter"""
id_ = None
name = 'class_'
id_gen = str(hex(random.randrange(1000)))
id_ = name str(counter()) "_" id_gen[2:]
return id_
def change_name_ref(inst_obj):
"""Change Instance Name to Instance ID"""
inst_obj.__name__ = inst_obj.id
a = foo(create_id()) # --> Assign a radnom Id
b = foo(create_id())
c = foo('class_1_15b')
change_name_ref(a)
change_name_ref(b)
change_name_ref(c)
ids = [a, b, c]
def get_instance(inst_list, target):
for idx, id_ in enumerate(inst_list):
if id_.__name__ == target:
inst = inst_list[idx]
print(f'Here The Class instance {inst}, ID: {inst.id}')
value = get_instance(ids, 'class_1_15b')
# Here The Class instance <__main__.foo object at 0x7f6988f016d0>, ID: class_1_15b
Комментарии:
1. да, это полностью делает то, что нам нужно здесь, и во многих ситуациях. но это был просто пример для того, чтобы рассказать вам, что я хочу сделать. я хочу знать, есть ли какой-нибудь способ получить объект из его свойства?
2. Хорошо, да, я просматривал приведенные выше комментарии, трудно понять, что вы имеете в виду, я имею в виду, кажется, что это не то, что кто-то делает. Но я думаю об этом.
3. Может быть, если вы дадите более полную картину того, что вы пытаетесь сделать, это будет иметь больше смысла? Вы спрашиваете об этом только для того, чтобы знать в целом, или потому, что было бы лучше в том, что вы реализуете?
4. в прошлом, когда мне было нужно. и я только что вспомнил это. с тех пор я до сих пор не знаю, как это сделать. поэтому я и спрашиваю. и для реализации я хотел бы узнать, как я могу сохранить стрелок пуль? по-прежнему dict является лучшим?
5. @FLAW Если Id — это не только числа, тогда я могу придумать способ, но опять же я вижу, работает ли, но кто-то не подойдет, как для удобства чтения, так и для производительности (поиск по словарю действительно быстрый) в любом случае, держитесь