Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类`对象的实例`_Python - Fatal编程技术网

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