Python 类`对象的实例`
我希望创建一个内置类Python 类`对象的实例`,python,Python,我希望创建一个内置类对象的实例,并将其用作某些变量的容器(如C++中的struct): 更新: 我需要一个容器来保存一些变量,但我不想使用 dict-能够书写a.f=2而不是a['f']=2 使用派生类可以避免键入引号 此外,有时自动完成也会起作用 是的。它被称为dict structything = {} structything['f'] = 2 print structything['f'] print structything.get('f') Id将您链接到文档,但它们已关闭。
对象的实例
,并将其用作某些变量的容器(如C++中的struct
):
更新:
- 我需要一个容器来保存一些变量,但我不想使用
dict-能够书写
而不是a.f=2
a['f']=2
- 使用派生类可以避免键入引号
- 此外,有时自动完成也会起作用
是的。它被称为dict
structything = {}
structything['f'] = 2
print structything['f']
print structything.get('f')
Id将您链接到文档,但它们已关闭。不,您必须将
对象子类化才能获得可变对象。确保在Python2.x中显式执行此操作:
class Struct(object):
pass
不过,使用内置容器可能更好,因为从语法上可以清楚地知道它到底是什么
无法将对象
的实例分配到的原因是,它们既没有\uuuuuu dict\uuuuuu
属性,也没有\uuuuu slots\uuuuu
属性,这两个位置都可以存储实例数据
>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
基本上,这相当于声明\uuuuuu插槽\uuuuu=[]
如果您知道希望结构
具有的所有字段,则可以使用插槽
创建一个可变的命名双
数据结构:
>>> class Foo(object):
... __slots__ = ['a', 'b', 'c']
...
>>> f = Foo()
>>> f.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: a
>>> f.a = 5
>>> f.a
5
我认识到反对dicts的情绪,因此我经常使用NamedTuples或class。Python中的Bunch
提供了很好的速记,允许您一次完成声明和赋值:
point = Bunch(x=x, y=y, squared=y*y)
point.x
印刷食谱(2ed)对此进行了广泛的讨论
IMHO,对象没有插槽和dict的原因是可读性:如果您先使用一个(匿名)对象存储坐标,然后使用另一个对象存储客户机数据,您可能会感到困惑。两个类定义明确了哪一个是哪一个。束不会 你到底为什么要这样做?我需要一个容器来保存一些变量,但我不想使用dict-来写a.f=2
而不是a['f']=2
你为什么不想写a['f']=2
仅仅为了编写a.f=2
这看起来有点愚蠢。如果你不想使用dict,我想除了像你那样定义自定义类之外,没有其他方法了。为什么你不想自己在定义自定义类时写两行呢?如果不想将其与现有代码混用,可以将其保留在其他模块中。可能是因为\uuuuu插槽\uuuu
是为对象
类定义的,这会阻止您向其添加更多属性。您不需要为自定义类定义\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>插槽,因此您可以为其分配属性。即使使用dict是pythonic方式,使用,我猜我和迪克特是一样的,对吧?我有没有提到如果我必须维护这样的代码,我会追捕作者并进行可怕的报复?不确定你是否犯有协助和教唆罪;)
>>> class Foo(object):
... __slots__ = ['a', 'b', 'c']
...
>>> f = Foo()
>>> f.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: a
>>> f.a = 5
>>> f.a
5
>>> f.d = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'd'
point = Bunch(x=x, y=y, squared=y*y)
point.x