Как создать встроенные объекты со свойствами в Python? - PullRequest
42 голосов
/ 07 октября 2009

В Javascript это будет:

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

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

Ответы [ 9 ]

80 голосов
/ 07 октября 2009
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})

существует два вида type использования функции .

25 голосов
/ 07 октября 2009

ответ Петра

obj = lambda: None
obj.propertyName = 'propertyValue'
19 голосов
/ 13 января 2015

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

>>> from types import SimpleNamespace

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

>>> obj.propertyName
'propertyValue'

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

12 голосов
/ 07 октября 2009

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

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

obj = InlineClass({'propertyName' : 'propertyValue'})
6 голосов
/ 07 октября 2009

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

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

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

2 голосов
/ 07 октября 2009

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

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

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

class Generic(object):
    pass

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

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

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

1 голос
/ 11 мая 2016

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

from collections import namedtuple

message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
    message('propertyValueOne'),
    message('propertyValueTwo')
]
0 голосов
/ 08 апреля 2019

У 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.

0 голосов
/ 07 октября 2009
class test:
    def __setattr__(self,key,value):
        return value


myObj = test()
myObj.mykey = 'abc' # set your property and value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...