在 Python 中是否有定义空对象的快捷方式,还是总是必须创建自定义空类的实例?
编辑:我的意思是一个可用于鸭子打字的空对象。
是的,在Python 3.3中添加了SimpleNamespace
与对象不同,使用 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'
>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>
type 的参数是:类名、基类元组和对象的字典。其中可以包含函数(对象的方法)或属性。
您实际上可以将第一行缩短为
>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)
因为默认情况下类型会创建继承自对象的新样式类。
type
在Python中用于元编程。 但是如果你只想创建一个对象的实例。然后,只需创建它的一个实例。就像莱杰洛特建议的那样。
像这样创建新类的实例有一个可能有用的重要区别。
>>> 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'
>>>
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!'
编辑SimpleNamespace。
class Myobject:
pass
x = Myobject()
x.test = "Hello, world!" # working
object
的实例?你可以简单地运行
a = object()
或者您的意思是初始化空引用?然后你就可以使用
a = None
我找到了一种不hacky但实际上是按照原始设计的方法。
>>> 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']
还有
[(p, getattr(x,p)) for p in x()]
# gives
# [('p1', 2), ('p2', 'Another property')]
def x():pass
x.test = 'Hello, world!'
空 Set 对象。如果提供了可选的可迭代参数,则使用迭代获得的元素更新集合。 iterable 中的所有元素都应该是不可变的,或者可以使用自动转换为不可变的协议部分中描述的协议转换为不可变的。
例如:
myobj = set()
for i in range(1,10): myobj.add(i)
print(myobj)
__init__
初始化器,你可以使用
__new__
:
class String(object):
...
uninitialized_empty_string = String.__new__(String)
来源:https://stackoverflow.com/a/2169191/6639500。