В Javascript это будет:
var newObject = { 'propertyName' : 'propertyValue' };
Как это сделать в Python?
В Javascript это будет:
var newObject = { 'propertyName' : 'propertyValue' };
Как это сделать в Python?
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
Питер отвечает
obj = lambda: None
obj.propertyName = 'propertyValue'
Python 3.3 добавила класс SimpleNamespace
для этой цели:
>>> from types import SimpleNamespace
>>> obj = SimpleNamespace(propertyName='propertyValue')
>>> obj
namespace(propertyName='propertyValue')
>>> obj.propertyName
'propertyValue'
В дополнение к соответствующему конструктору для построения объекта SimpleNamespace
определяет __repr__
и __eq__
(задокументированный в 3.4), чтобы вести себя так, как ожидалось.
Я не знаю, есть ли встроенный способ сделать это, но вы всегда можете определить класс следующим образом:
class InlineClass(object):
def __init__(self, dict):
self.__dict__ = dict
obj = InlineClass({'propertyName' : 'propertyValue'})
Мне нравится идея Smashery, но Python кажется довольным, позволяя вам самостоятельно изменять классы:
>>> class Inline(object):
... pass
...
>>> obj = Inline()
>>> obj.test = 1
>>> obj.test
1
>>>
Для меня отлично работает Python 2.5. Обратите внимание, что вам нужно сделать это для класса, полученного из object
- он не будет работать, если вы измените строку на obj = object
.
В Python легко объявить класс с функцией __init__()
, которая может настроить экземпляр для вас с необязательными аргументами. Если вы не укажете аргументы, вы получите пустой экземпляр, и если вы укажете некоторые или все аргументы, которые вы инициализируете экземпляр.
Я объяснил это здесь (мой самый высокий рейтинг на сегодняшний день), поэтому я не буду повторять объяснение. Но, если у вас есть вопросы, спросите, и я отвечу.
Если вам нужен только общий объект, класс которого действительно не имеет значения, вы можете сделать это:
class Generic(object):
pass
x = Generic()
x.foo = 1
x.bar = 2
x.baz = 3
Очевидным расширением будет добавление функции __str__()
, которая печатает что-то полезное.
Этот трюк приятен иногда, когда вам нужен более удобный словарь. Мне легче набрать x.foo
, чем x["foo"]
.
Другим жизнеспособным вариантом является использование namedtuple:
from collections import namedtuple
message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
message('propertyValueOne'),
message('propertyValueTwo')
]
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = 'abc' # set your property and value
У 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.