我想创建一个一次性"struct"对象来保存各种状态标志.我的第一个方法就是这个(javascript风格)
>>> status = object()
>>> status.foo = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud)
绝对不是我的预期,因为这有效:
>>> class Anon: pass
...
>>> b=Anon()
>>> b.foo = 4
Run Code Online (Sandbox Code Playgroud)
我想这是因为object()没有__dict__.我不想使用字典,假设我不想创建Anon对象,还有其他解决方案吗?
Ale*_*lli 25
制作"可以分配/获取属性的通用对象"的最简洁方法可能是:
b = lambda:0
Run Code Online (Sandbox Code Playgroud)
正如大多数其他答案所指出的那样,还有很多其他的方法,但是为了简洁而难以击败这个方面(lambda:0与object()...的数字完全相同; ;-).
Esc*_*alo 15
9.7.什物
有时,使用类似于Pascal"record"或C"struct"的数据类型是很有用的,将一些命名数据项捆绑在一起.一个空的类定义可以很好地完成:
class Employee:
pass
john = Employee() # Create an empty employee record
# Fill the fields of the record
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000
Run Code Online (Sandbox Code Playgroud)
这似乎很自然而简单:Pythonic.记住禅!"简单比复杂更好"(第3号)和"如果实施容易解释,那可能是个好主意"(编号11)
另外,a struct只不过是class公共成员(即,struct{};并且class{public:};完全相同(例如,C++)).您是否应该考虑这一点并避免在Python程序中使用人工构造?Python应该是可读的,可维护的,易于理解的.
我曾经有过同样的问题.我在邮件列表中问过它,Alex Martelli指出这object是Python中所有继承的基础; 如果object()用自己的字典创建了一个类实例,那么Python中的每个对象都必须有自己的字典,这会浪费内存.例如,True和False是对象; 显然他们对自己的词典没有任何需要!
如果有某种内置的Python功能,我会很高兴我可以说:
x = struct()
x.foo = 1
x.bar = 2
Run Code Online (Sandbox Code Playgroud)
但写下来是微不足道的struct():
class struct(object):
pass
Run Code Online (Sandbox Code Playgroud)
或者你可以做一个稍微复杂的一个:
class struct(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
Run Code Online (Sandbox Code Playgroud)
更复杂的一个让你这样做:
x = struct(foo=1, bar=2)
print(x.foo) # prints 1
print(x.bar) # prints 2
x.baz = 3
print(x.baz) # prints 3
Run Code Online (Sandbox Code Playgroud)
但是编写它是如此微不足道struct(),我想它不值得添加到语言中.也许我们应该推动将标准功能添加到collections模块或其他东西.
我个人认为最干净的解决方案是您已经猜到的:
class Scratch(object):
pass
s = Scratch()
s.whatever = 'you want'
Run Code Online (Sandbox Code Playgroud)
我知道你说过你不想要 a __dict__,但这让我感到困惑,因为我看不出有理由关心它。您不必引用__dict__,这是一个内部 Python 实现细节。无论如何,Python 中允许动态添加属性的任何实例都会有一个,__dict__因为 Python 就是这样处理动态属性的。即使实例是以非常聪明的方式创建的,它也会有一个__dict__.
如果您还没有这样做,我建议您阅读PEP 20和PEP 8。并不是说 PEP 与您的问题直接相关,但我认为以Pythonic 的方式开始使用 Python 很有用。
| 归档时间: |
|
| 查看次数: |
15652 次 |
| 最近记录: |