代码之家  ›  专栏  ›  技术社区  ›  nerdfever.com

创建具有附加属性的元组状对象?

  •  0
  • nerdfever.com  · 技术社区  · 6 年前

    有没有一种Pythonic方法可以创建一个类似元组的对象(它的行为类似元组),但具有附加属性?尤其是在 __name__ 属性?

    现在我做了这样的事情:

    foo = ( 1, 9, (12.5, "bar"), "baz" )
    foo.__name__ = 'foo'
    

    但我觉得那不是很像蟒蛇。我不能通过 foo (元组赋值的第一行)并让函数创建 __姓名__

    什么是蟒蛇的方式?

    bar = new_kind_of_thing(( 1, 9, (12.5, "floob"), "baz" ))
    print(bar[2])
    print(bar[0])
    print(bar.__name__)
    

    输出:

    (12.5, 'floob')
    1
    'bar'
    
    4 回复  |  直到 6 年前
        1
  •  5
  •   Lev Zakharov Riss    6 年前

    只需创建从元组继承并重写的新类 __new__ __init__

    class MyTuple(tuple):
        def __new__(cls, name, values):
            return super().__new__(cls, values)
    
        def __init__(self, name, values):
            self.__name__ = name
            self.values = values
    
    foo = MyTuple('foo', (1, 2, 3))
    
    print(foo)
    print(foo.__name__)
    

    (1, 2, 3)
    'foo'
    
        2
  •  1
  •   MBT Nina Golyandina    6 年前

    class TupleWithName(tuple):
        pass
    
    t = TupleWithName((1, 2, 3))
    t.name = 'tuple one'
    
    print(t)
    # (1, 2, 3)
    
    print(t.name)
    # 'tuple one'
    
        3
  •  0
  •   Fedor    6 年前

    使用namedtuple( https://docs.python.org/3/library/collections.html#collections.namedtuple

    from collections import namedtuple
    Foo = namedtuple('Foo', ['x', 'y', 'pair', 'title'])
    foo = Foo(1, 9, (12.5, "bar"), "baz") # foo.x == 1, foo.y == 9, etc
    bar = Foo(2, 10, (11., "abc"), "zzz")
    
        4
  •  0
  •   Schalton    6 年前

    是的,您可以通过一个“映射”来实现这一点——用其他类的属性创建一个自定义类。

    资源: http://www.kr41.net/2016/03-23-dont_inherit_python_builtin_dict_type.html

    您最好使用更复杂的数据结构,例如元组字典。

    my_tuples = {
         "tuple1":(1,2,3),
         "tuple2":(3,5,6),
    }
    

    或(注释结构)

    my_tuples = {}
    my_tuples["tuple1"] = (1, 2, 3)
    my_tuples["tuple2"] = (4, 5, 6)
    

    print(my_tuples["tuple1"])
    (1,2,3)