簡體   English   中英

在python中創建一個匿名類實例

[英]Create an anonymous class instance in python

有時候我需要在python中創建一個匿名類實例,就像c#一樣:

var o= new {attr1="somehing", attr2=344};

但是在python中我這樣做:

class Dummy: pass
o = Dummy()
o.attr1 = 'something'
o.attr2 = 344
#EDIT 1
print o.attr1, o.attr2

如何在單一語句中以pythonic方式做到這一點?

o = type('Dummy', (object,), { "attr1": "somehing", "attr2": 344 })
o.attr3 = "test"
print o.attr1, o.attr2, o.attr3

類型

雖然這不是一個單一的陳述,我認為圍繞接受的答案的魔力創建一個包裝器使它更具可讀性。

import inspect 

# wrap the type call around a function 
# use kwargs to allow named function arguments
def create_type(name, **kwargs):
    return type(name, (object,), kwargs)

# example call to make a structure
p = create_type('foobar', xxx='barfoo', seti=0)

assert p.xxx == 'barfoo'
assert p.seti == 0

print inspect.getmembers(p)

產量

[('__class__', <type 'type'>),
 ('__delattr__', <slot wrapper '__delattr__' of 'object' objects>),
 ('__dict__', <dictproxy object at 0x9a5050>),
 ('__doc__', None),
 ('__format__', <method '__format__' of 'object' objects>),
 ('__getattribute__', <slot wrapper '__getattribute__' of 'object' objects>),
 ('__hash__', <slot wrapper '__hash__' of 'object' objects>),
 ('__init__', <slot wrapper '__init__' of 'object' objects>),
 ('__module__', '__main__'),
 ('__new__', <built-in method __new__ of type object at 0x399c578460>),
 ('__reduce__', <method '__reduce__' of 'object' objects>),
 ('__reduce_ex__', <method '__reduce_ex__' of 'object' objects>),
 ('__repr__', <slot wrapper '__repr__' of 'object' objects>),
 ('__setattr__', <slot wrapper '__setattr__' of 'object' objects>),
 ('__sizeof__', <method '__sizeof__' of 'object' objects>),
 ('__str__', <slot wrapper '__str__' of 'object' objects>),
 ('__subclasshook__', <built-in method __subclasshook__ of type object at 0x919370>),
 ('__weakref__', <attribute '__weakref__' of 'foobar' objects>),
 # here they are
 ('seti', 0),
 ('xxx', 'barfoo')]

namedtuple

from collections import namedtuple

d = { 'a' : 'foo', 'b' : 'bar' }
foobar = namedtuple('foobar', d.keys())(**d)
print foobar

產量

Python 2.7.5 (default, May 30 2013, 16:55:57) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import namedtuple
>>> d  =  { 'a' : 'foo', 'b' : 'bar' }
>>> foobar = namedtuple('foobar', d.keys())(**d)
>>> print foobar
foobar(a='foo', b='bar')
>>> 

如果您使用的是Python 3.3或更高版本,則可以使用types.SimpleNamespace

from types import SimpleNamespace

o = SimpleNamespace(attr1="something", attr2=344)
print(o)

# namespace(attr1='something', attr2=344)
class attrdict(dict):
    def __getattr__(self, key):
        return self[key]

o = attrdict(attr1='something', attr2=344)

o.attr1

但似乎你應該只使用一個標准的字典。

我更喜歡來自mwhite的dict答案,但是這就是我過去使用kwargs的“魔法”(雙關語)所做的。

class ObjectFromDict(object):
    def __init__(**kwargs):
        for k in kwargs:
            if k not in self.__dict__:
                setattr(k,v)

myObj = ObjectFromDict(**{'foo': 'bar', 'baz': 'monkey'})
print myObj.foo #bar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM