73

在 Javascript 中,它将是:

var newObject = { 'propertyName' : 'propertyValue' };
newObject.propertyName;  // returns "propertyValue"

但是 Python 中的相同语法会创建一个字典,这不是我想要的

new_object = {'propertyName': 'propertyValue'}
new_object.propertyName  # raises an AttributeError
4

9 回答 9

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

两种type功能用途

于 2009-10-07T01:04:15.273 回答
55

Python 3.3SimpleNamespace为此目的添加了该类:

>>> from types import SimpleNamespace

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

>>> obj.propertyName
'propertyValue'

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

于 2015-01-13T20:58:16.887 回答
36

彼得的回答

obj = lambda: None
obj.propertyName = 'propertyValue'
于 2009-10-07T01:23:07.270 回答
11

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

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

obj = InlineClass({'propertyName' : 'propertyValue'})
于 2009-10-07T00:47:01.690 回答
7

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

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

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

于 2009-10-07T01:00:48.743 回答
3

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 的人。

于 2019-04-08T19:56:40.930 回答
2

在 Python 中很容易声明一个类,该类具有一个__init__()可以为您设置实例的函数,并带有可选参数。如果您不指定参数,您将获得一个空白实例,并且如果您指定部分或全部参数,您将初始化该实例。

我在这里解释了它(我迄今为止评价最高的答案),所以我不会重新输入解释。但是,如果您有任何问题,请提出,我会回答。

如果你只想要一个类并不重要的通用对象,你可以这样做:

class Generic(object):
    pass

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

一个明显的扩展是添加一个__str__()打印有用信息的函数。

当你想要一个更方便的字典时,这个技巧有时很好。我发现打字x.foox["foo"].

于 2009-10-07T06:39:34.453 回答
2

另一个可行的选择是使用namedtuple

from collections import namedtuple

message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
    message('propertyValueOne'),
    message('propertyValueTwo')
]
于 2016-05-11T07:19:13.787 回答
0
class test:
    def __setattr__(self,key,value):
        return value


myObj = test()
myObj.mykey = 'abc' # set your property and value
于 2009-10-07T02:04:35.807 回答