如何在Python中创建具有属性的内联对象?

Jad*_*ias 48 python dynamic-languages instantiation

在Javascript中它将是:

var newObject = { 'propertyName' : 'propertyValue' };
Run Code Online (Sandbox Code Playgroud)

怎么用Python做?

Sil*_*ost 85

obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
Run Code Online (Sandbox Code Playgroud)

两种type功能用途.

  • 为了完整性,要创建类型的实际*实例*而不仅仅是类型对象,这需要一个尾随的`()`:`obj = type('obj',(object,),{'propertyName':'propertyValue "})()` (24认同)
  • 实际上,@劳伦斯,我的反应是,"哇,我敢打赌,它会创建一个由'`object`继承的``obj'`类的新实例,`'propertyName'`成员设置为''propertyValue' "." 你知道什么?我是正确的!我不认为这太不直观了. (15认同)
  • 记录但隐晦的行为.我很确定99.9%的Python程序员在实际代码中看到这个的初步反应是"WTF!?". (11认同)
  • 这是怎样的混淆?这是一个适当的记录行为. (5认同)
  • 它是灵活的,简洁的,可读的代码,这使我选择python. (2认同)
  • 有趣的是,尽管Greg Hewgill指出了这个错误,但这个"可读"的代码已被大量推崇. (2认同)
  • 在Python 3中,您不需要继承`object`,您只需执行`obj = type('obj', (), {'property_name' : 'property_value'})` (2认同)

Jad*_*ias 28

彼得的回答

obj = lambda: None
obj.propertyName = 'propertyValue'
Run Code Online (Sandbox Code Playgroud)


Syl*_*oux 28

Python 3.3 SimpleNamespace为这个目的添加了类:

>>> from types import SimpleNamespace

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

>>> obj.propertyName
'propertyValue'
Run Code Online (Sandbox Code Playgroud)

除了用于构建对象的适当构造函数之外,还SimpleNamespace定义__repr____eq__(在3.4中记录)以按预期运行.

  • 这应该是公认的答案。比创建新的“类型”更具可读性并且更直观。 (3认同)

Sma*_*ery 13

我不知道是否有内置的方法来做,但你总是可以定义这样的类:

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

obj = InlineClass({'propertyName' : 'propertyValue'})
Run Code Online (Sandbox Code Playgroud)


Chr*_*utz 6

我喜欢Smashery的想法,但Python似乎满足于让你自己修改类:

>>> class Inline(object):
...     pass
...
>>> obj = Inline()
>>> obj.test = 1
>>> obj.test
1
>>>
Run Code Online (Sandbox Code Playgroud)

在Python 2.5中工作得很好.请注意,您必须对从派生的类执行此操作object- 如果将行更改为,则无效obj = object.

  • 如果你想要一个内联类,你可以使用`obj = lambda:None`,这是奇怪的,但会执行必要的任务...... (6认同)
  • 是的,你可以这样做 - 但由于一些奇怪的原因,你不能使用object() - 你必须创建自己的类. (2认同)

Leo*_*nkv 5

SilentGhost 有一个很好的答案,但他的代码实际上创建了一个元类类型的新对象,换句话说,它创建了一个类。类是 Python 中的对象!

obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
type(obj) 
Run Code Online (Sandbox Code Playgroud)

给出

<class 'type'>
Run Code Online (Sandbox Code Playgroud)

要在一行中创建具有dict属性(又名属性)的自定义或内置类的新对象,我建议只调用它:

new_object = type('Foo', (object,), {'name': 'new object'})()
Run Code Online (Sandbox Code Playgroud)

现在

type(new_object) 
Run Code Online (Sandbox Code Playgroud)

<class '__main__.Foo'>
Run Code Online (Sandbox Code Playgroud)

这意味着它是 Foo 类的对象

希望对 Python 新手有所帮助。