Рекурсивно конвертировать граф объектов Python в словарь

Вам нужно найти GameObject, который содержит компонент скрипта, на который вы планируете получить ссылку. Убедитесь, что GameObject уже находится в сцене, или Find вернет null.

 GameObject g = GameObject.Find("GameObject Name");

Затем вы можете схватить скрипт:

 BombDrop bScript = g.GetComponent();

Затем вы можете доступ к переменным и функциям скрипта.

 bScript.foo();

Я только что понял, что на тот же день я ответил на очень похожий вопрос: Не знаю, как получить здоровье врага


Я немного расскажу о вашем вопросе, так как я уже ответил на это.

Что ваш код делает, так это: «Посмотрите в мой GameObject для BombDropScript, большую часть времени сценарий не будет прикреплен к одному и тому же GameObject.

Также используйте setter и getter для maxBombs.

public class BombDrop : MonoBehaviour
{
    public void setMaxBombs(int amount)
    {
        maxBombs += amount;
    }

    public int getMaxBoms()
    {
        return maxBombs;
    }
}

30
задан Community 23 May 2017 в 12:09
поделиться

3 ответа

Объединение моей собственной попытки и подсказок, полученных из ответов Анурага Униала и Леннарта Регебро, лучше всего подходит для меня:

def todict(obj, classkey=None):
    if isinstance(obj, dict):
        data = {}
        for (k, v) in obj.items():
            data[k] = todict(v, classkey)
        return data
    elif hasattr(obj, "_ast"):
        return todict(obj._ast())
    elif hasattr(obj, "__iter__") and not isinstance(obj, str):
        return [todict(v, classkey) for v in obj]
    elif hasattr(obj, "__dict__"):
        data = dict([(key, todict(value, classkey)) 
            for key, value in obj.__dict__.items() 
            if not callable(value) and not key.startswith('_')])
        if classkey is not None and hasattr(obj, "__class__"):
            data[classkey] = obj.__class__.__name__
        return data
    else:
        return obj
42
ответ дан 27 November 2019 в 20:28
поделиться

В Python есть много способов заставить объекты вести себя немного по-другому, например, метаклассы и тому подобное, и он может переопределять getattr и, таким образом, иметь «магические» атрибуты, которые вы не можете видеть сквозь dict и т. д. Короче говоря, маловероятно, что вы получите 100% полную картину в общем случае каким-либо методом, который вы используете.

Поэтому ответ таков: если он работает для вас в случае использования, который у вас есть сейчас, тогда код правильный. ; -)

Чтобы сделать код более общим, вы можете сделать что-то вроде этого:

import types
def todict(obj):
    # Functions, methods and None have no further info of interest.
    if obj is None or isinstance(subobj, (types.FunctionType, types.MethodType))
        return obj

    try: # If it's an iterable, return all the contents
        return [todict(x) for x in iter(obj)]
    except TypeError:
        pass

    try: # If it's a dictionary, recurse over it:
        result = {}
        for key in obj:
            result[key] = todict(obj)
        return result
    except TypeError:
        pass

    # It's neither a list nor a dict, so it's a normal object.
    # Get everything from dir and __dict__. That should be most things we can get hold of.
    attrs = set(dir(obj))
    try:
        attrs.update(obj.__dict__.keys())
    except AttributeError:
        pass

    result = {}
    for attr in attrs:
        result[attr] = todict(getattr(obj, attr, None))
    return result            

Что-то вроде этого. Однако этот код не протестирован. Это все еще не распространяется на случай, когда вы переопределяете getattr , и я уверен, что есть еще много случаев, которые он не охватывает и может быть не покрыт. :)

2
ответ дан 27 November 2019 в 20:28
поделиться

Я не знаю, какова цель проверки базовой строки или объекта? также dict не будет содержать никаких вызываемых объектов, если у вас нет атрибутов, указывающих на такие вызываемые объекты, но в этом случае разве это не часть объекта?

поэтому вместо проверки различных типов и значений позвольте todict convert объект, и если он вызывает исключение, введите исходное значение.

todict вызовет исключение только в том случае, если obj не имеет dict например

class A(object):
    def __init__(self):
        self.a1 = 1

class B(object):
    def __init__(self):
        self.b1 = 1
        self.b2 = 2
        self.o1 = A()

    def func1(self):
        pass

def todict(obj):
    data = {}
    for key, value in obj.__dict__.iteritems():
        try:
            data[key] = todict(value)
        except AttributeError:
            data[key] = value
    return data

b = B()
print todict(b)

он печатает {'b1': 1, 'b2': 2, 'o1': {'a1': 1}} могут быть и другие случаи, которые следует рассмотреть, но это может быть хорошим началом

особых случаев если объект использует слоты, вы не сможете получить dict например, исправление

class A(object):
    __slots__ = ["a1"]
    def __init__(self):
        self.a1 = 1

для случаев слотов может заключаться в использовании dir () вместо прямого использования dict

7
ответ дан 27 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: