У меня есть класс, где я хочу быть в состоянии проверить его членов и перечислить их. Тем не менее, я только собираюсь подклассифицировать это (в C++ это будет абстрактный класс), поэтому я хочу, чтобы этот метод также возвращал члены в свой дочерний класс.Доступ к ребенку __dict__ от родителя в Python?
Возможно ли это или даже хорошая идея в Python? И продолжение, возможно ли это без модуля inspect
?
Как так:
class A:
@staticmethod
def GetMembers():
return dict(vars(A))
class B(A):
FOO = 'foobar'
BAR = 'barfoo'
Однако тестирование показывает:
>>> A.GetMembers()
{'__module__': '__main__', '__doc__': None, 'GetMembers': <staticmethod object at 0x02219BB0>}
>>> B.GetMembers()
{'__module__': '__main__', '__doc__': None, 'GetMembers': <staticmethod object at 0x02219BB0>}
>>> dict(vars(B))
{'__module__': '__main__', 'FOO': 'foobar', 'BAR': 'barfoo', '__doc__': None}
Я хочу B.GetMembers()
включить FOO
и BAR
как dict(vars(B))
делает.
Используйте [ '@ classmethod'] (http://docs.python.org/2/library/functions.html#classmethod) вместо '@ staticmethod' и проверьте параметр' cls'. Ваше ограничение «без модуля проверки» не имеет смысла - это модуль, для которого нужно проверять объекты «отражением», почему вы не хотите его использовать? И последнее, но не менее важное: в вашем примере кода 'FOO' и' BAR' являются членами объекта класса 'B' - это ** не ** члены экземпляров' B'. Нет общего способа перечисления атрибутов экземпляров класса, не прибегая к самим примерам. – millimoose
Есть способы обойти последнее, используя определенные шаблоны, например, используя [слоты] (http://docs.python.org/2/reference/datamodel.html#slots), [named tuples] (http: // docs .python.org/2/library/collections.html # collections.namedtuple) или [traits] (http://code.enthought.com/projects/traits/) - или любым другим способом, в котором вы явно добавляете какой-либо вид метаданные для ваших классов. Просто не для какого-либо объекта вообще. – millimoose
@staticmethod ужасно ... Я никогда не вижу причин использовать его ... –