在Python中创建一个空对象

Smi*_*les 64 python oop

是否有任何用于在Python中定义空对象的快捷方式,或者您是否始终必须创建自定义空类的实例?

编辑:我的意思是一个可用于鸭子打字的空对象.

ayc*_*dee 82

您可以使用type来动态创建新类,然后实例化它.像这样:

>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>
Run Code Online (Sandbox Code Playgroud)

键入的参数是:类名,基类的元组和对象的字典.其中可以包含函数(对象的方法)或属性.

你实际上可以缩短第一行

>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)
Run Code Online (Sandbox Code Playgroud)

因为默认情况下,type会创建从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'
Run Code Online (Sandbox Code Playgroud)

在哪里:

>>> b = type('', (), {})()
>>> b.this_works = 'cool'
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 你甚至可以将第一行缩短为`t = type('',(),{})()` (4认同)

Vla*_*den 57

是的,在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'
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。请注意,这比涉及 t = type('test', (object,), {})() 的答案简单得多。 (6认同)
  • 优秀。我希望这在Python 3中变得更容易了! (2认同)

Wil*_*ill 42

创建一个空(-ish)对象的一种简单,不太可怕的方法是利用函数是Python中的对象这一事实,包括Lambda函数:

obj = lambda: None
obj.test = "Hello, world!"
Run Code Online (Sandbox Code Playgroud)

例如:

In [18]: x = lambda: None

In [19]: x.test = "Hello, world!"

In [20]: x.test
Out[20]: 'Hello, world!'
Run Code Online (Sandbox Code Playgroud)

  • 嗯,但它有一个缺点,你不能分配给`x .__ class __ .somefunc` (3认同)
  • 当我尝试 copy.deepcopy() 这个对象时,这个解决方案有问题。python 3 中的 types.SimpleNamespace() 是一个更好的解决方案。 (3认同)

lej*_*lot 13

你对"空物"是什么意思?上课的实例object?你可以简单地跑

a = object()
Run Code Online (Sandbox Code Playgroud)

或者你的意思是初始化为null引用?然后你可以使用

a = None
Run Code Online (Sandbox Code Playgroud)

  • 我想知道OP可以用``a``定义为``object()``或``None``,因为在这种情况下,``a``没有命名空间``__dict__``并且没有属性可以添加到``a``,例如``ax = 10``. (19认同)
  • 事实上,`a = object(); a.foo = 'bar'` 给出 `AttributeError: 'object' 对象没有属性 'foo'`。 (2认同)

Bas*_*asj 6

你在问题中说过,但由于没有答案用代码提到它,这可能是最干净的解决方案之一:

class Myobject:
    pass

x = Myobject()
x.test = "Hello, world!"  # working

Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这不是首选答案。看起来是最Pythonic的答案。 (3认同)