Как создать встроенные объекты со свойствами в Python?

В Javascript это будет:

var newObject = { 'propertyName' : 'propertyValue' };

Как это сделать в Python?

Ответ 2

Питер отвечает

obj = lambda: None
obj.propertyName = 'propertyValue'

Ответ 3

Python 3.3 добавила класс SimpleNamespace для этой цели:

>>> from types import SimpleNamespace

>>> obj = SimpleNamespace(propertyName='propertyValue')
>>> obj
namespace(propertyName='propertyValue')

>>> obj.propertyName
'propertyValue'

В дополнение к соответствующему конструктору для построения объекта SimpleNamespace определяет __repr__ и __eq__ (задокументированный в 3.4), чтобы вести себя так, как ожидалось.

Ответ 4

Я не знаю, есть ли встроенный способ сделать это, но вы всегда можете определить класс следующим образом:

class InlineClass(object):
    def __init__(self, dict):
        self.__dict__ = dict

obj = InlineClass({'propertyName' : 'propertyValue'})

Ответ 5

Мне нравится идея Smashery, но Python кажется довольным, позволяя вам самостоятельно изменять классы:

>>> class Inline(object):
...     pass
...
>>> obj = Inline()
>>> obj.test = 1
>>> obj.test
1
>>>

Для меня отлично работает Python 2.5. Обратите внимание, что вам нужно сделать это для класса, полученного из object - он не будет работать, если вы измените строку на obj = object.

Ответ 6

В Python легко объявить класс с функцией __init__(), которая может настроить экземпляр для вас с необязательными аргументами. Если вы не укажете аргументы, вы получите пустой экземпляр, и если вы укажете некоторые или все аргументы, которые вы инициализируете экземпляр.

Я объяснил это здесь (мой самый высокий рейтинг на сегодняшний день), поэтому я не буду повторять объяснение. Но, если у вас есть вопросы, спросите, и я отвечу.

Если вам нужен только общий объект, класс которого действительно не имеет значения, вы можете сделать это:

class Generic(object):
    pass

x = Generic()
x.foo = 1
x.bar = 2
x.baz = 3

Очевидным расширением будет добавление функции __str__(), которая печатает что-то полезное.

Этот трюк приятен иногда, когда вам нужен более удобный словарь. Мне легче набрать x.foo, чем x["foo"].

Ответ 7

Другим жизнеспособным вариантом является использование namedtuple:

from collections import namedtuple

message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
    message('propertyValueOne'),
    message('propertyValueTwo')
]

Ответ 8

class test:
    def __setattr__(self,key,value):
        return value


myObj = test()
myObj.mykey = 'abc' # set your property and value

Ответ 9

У SilentGhost был хороший ответ, но его код фактически создает новый объект типа метакласса, другими словами, он создает класс. А классы - это объекты в Python!

obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
type(obj) 

дает

<class 'type'>

Чтобы создать новый объект пользовательского или встроенного класса с атрибутами dict (или свойствами) в одной строке, я бы предложил просто вызвать его:

new_object = type('Foo', (object,), {'name': 'new object'})()

и сейчас

type(new_object) 

является

<class '__main__.Foo'>

что означает, что это объект класса Foo

Я надеюсь, что это поможет тем, кто плохо знаком с Python.