在Python中是否有定义空对象的快捷方式,还是总是需要创建自定义空类的实例?
编辑:我指的是可用于鸭子类型的空对象。
是的,在Python 3.3中添加了SimpleNamespace
与object不同,使用SimpleNamespace可以添加和删除属性。如果使用关键字参数初始化SimpleNamespace对象,则这些参数将直接添加到基础命名空间中。
示例:
import types
x = types.SimpleNamespace()
x.happy = True
print(x.happy) # True
del x.happy
print(x.happy) # AttributeError. object has no attribute 'happy'
该模块定义了实用函数,以帮助动态创建新类型。
- Vlad Bezden>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>
type的参数包括:类名,基类元组和对象字典。字典中可以包含函数(对象的方法)或属性。
事实上,你可以将第一行缩短为
>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)
因为默认情况下,类型创建新的样式类,这些类继承自对象。
type
在 Python 中用于元编程。
但是,如果您只想创建一个对象实例。那么,只需创建该实例。就像lejlot建议的那样。
像这样创建一个新类的实例具有一个重要的区别,可能会很有用。
>>> a = object()
>>> a.whoops = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'whoops'
然而:
>>> b = type('', (), {})()
>>> b.this_works = 'cool'
>>>
创建一个空(大致为空)对象的一种简单而不那么可怕的方法是利用Python中函数是对象的事实,包括Lambda函数:
obj = lambda: None
obj.test = "Hello, world!"
例如:In [18]: x = lambda: None
In [19]: x.test = "Hello, world!"
In [20]: x.test
Out[20]: 'Hello, world!'
x.__class__.somefunc
。 - Hugh Perkins你在问题中已经提到了它,但是由于没有答案提供相应的代码,所以这可能是最干净的解决方案之一:
class Myobject:
pass
x = Myobject()
x.test = "Hello, world!" # working
您所说的“空对象”是什么意思?是指 object
类的实例吗?您可以直接运行以下代码
a = object()
或者您是指将初始化为 null 引用?那么您可以使用
a = None
a = object(); a.foo = 'bar'
会报错 AttributeError: 'object' object has no attribute 'foo'
。 - Basj>>> from mock import Mock
>>> foo = Mock(spec=['foo'], foo='foo')
>>> foo.foo
'foo'
>>> foo.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../virtualenv/local/lib/python2.7/site-packages/mock/mock.py", line 698, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'bar'
您可以使用
x = lambda: [p for p in x.__dict__.keys()]
x.p1 = 2
x.p2 = "Another property"
在...
x()
# gives
# ['p1', 'p2']
And
[(p, getattr(x,p)) for p in x()]
# gives
# [('p1', 2), ('p2', 'Another property')]
myobj = set()
for i in range(1,10): myobj.add(i)
print(myobj)
def x():pass
x.test = 'Hello, world!'
如果您想要创建一个特定类型的空对象,也就是说,您想要创建它但不调用__init__
初始化程序,则可以使用__new__
:
class String(object):
...
uninitialized_empty_string = String.__new__(String)