在 Python 中是否有定义空对象的快捷方式,或者您总是必须创建自定义空类的实例?
编辑: 我的意思是一个空对象可用于鸭类型。
你说的“空对象”是什么意思? 类 object的实例? 你可以简单地运行
object
a = object()
或者也许你是指初始化为空引用? 然后你可以使用
a = None
您可以使用 type 动态创建一个新类,然后将其实例化,如下所示:
>>> t = type('test', (object,), {})() >>> t <__main__.test at 0xb615930c>
要输入的参数是: 类名、基类的元组和对象的字典。它可以包含函数(对象的方法)或属性。
实际上可以将第一行缩短为
>>> t = type('test', (), {})() >>> t.__class__.__bases__ (object,)
因为默认情况下,type 创建从对象继承的新样式类。
type在 Python 中用于 元编程。
type
但是如果你只想创建一个对象的实例。然后,创建它的一个实例。就像 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' >>>
创建一个空(- ish)对象的一个简单、看起来不那么吓人的方法是利用函数是 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!'
Yes, in Python 3.3 SimpleNamespace was added
与对象不同,使用 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'
所有提出的解决方案都有些令人尴尬。
我发现了一种不是粗糙的方法,而是根据最初的设计。
>>> 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'
See the documentation of unittest.mock here.
构造一个新的 空的 Set 对象。如果提供了可选的迭代参数,则使用从迭代中获得的元素更新集合。迭代中的所有元素都应该是不可变的,或者可以使用协议部分中描述的协议转换为不可变的,以便自动转换为不可变的。
myobj = set() for i in range(1,10): myobj.add(i) print(myobj)
You said it in the question, but as no answer mentioned it with code, this is probably one of the cleanest solutions:
class Myobject: pass x = Myobject() x.test = "Hello, world!" # working
In my opinion, the easiest way is:
def x():pass x.test = 'Hello, world!'
你可以用
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')]
如果有一个需要的空对象类型,换句话说,你想创建它,但不调用 __init__初始化器,你可以使用 __new__:
__init__
__new__
class String(object): ... uninitialized_empty_string = String.__new__(String)
资料来源: https://stackoverflow.com/a/2169191/6639500。