【问题标题】:Python Class member accessPython 类成员访问
【发布时间】:2019-05-22 16:28:42
【问题描述】:

我是 python 新手,正在努力学习它。有人可以帮我解决一个简单的问题。我正在创建一个对象,如下所示:

 def myList(list):

    def __repr__(self):
    return list.__repr__(self)

所以本质上只是一个列表。但是在输入输入列表之后,我想立即将其值加倍。即

当我使用时

 t = myList([1, 2, 3])
 print(t)

它应该输出[2, 4 ,6]

现在我知道如何将列表的每个元素加倍,例如我可以使用

 l = [x * 2 for x in l]

但我不确定如何在创建后立即访问 myList 对象的成员并将它们加倍。

【问题讨论】:

    标签: python list operator-overloading subclass


    【解决方案1】:

    在将输入传递给list__init__ 之前,您需要覆盖__init__ 来执行输入转换,例如使用列表推导式或生成器表达式:

    class myList(list):
        def __init__(self, it=()):
            super().__init__([x * 2 for x in it])
    
        def __repr__(self):
            return list.__repr__(self)
    

    生成器表达式版本为super().__init__(x * 2 for x in it);它避免了一个可能很大的临时list,但它通常会慢一点。

    旁注:这里根本不需要覆盖__repr__;你会自动从list 继承它,所以你也可以完全省略定义。仅当您希望 display 加倍,但 store 原始值时,覆盖它才有意义,在这种情况下您想要:

    class myList(list):
        def __repr__(self):
            return repr([x * 2 for x in self])
    

    编辑:因为 OP 请求了一种初始化 myList 的方法,然后将值加倍,您可以立即调用 list 的初始化器,然后在 myList 上进行加倍. myList__init__ 返回之前还没有完全初始化,它会更慢,但这将底层的list 初始化与加倍分开:

    class myList(list):
        def __init__(self, it=()):
            super().__init__(it)  # Perform list initialization with original values
            # Cycle through values and double each one
            for i, x in enumerate(self):
                self[i] = x * 2
    

    【讨论】:

    • 非常感谢。所以基本上在幕后这些是我调用 myList(some list) 时发生的步骤: 1> 加倍发生在“some list” 2> 然后 myList 被调用“double of some list”。只是出于好奇,是否有另一种方法,首先实例化 myList 然后将成员变量加倍?
    • @user1612986:这是从参数中创建一个临时的list 并具有双倍值,然后将其传递给lists 初始化器,因此myList 从一开始就具有双倍值。使返回的myList 已经加倍的唯一另一种方法是正常初始化,然后就地加倍,这将变得更慢且更丑陋。我将在一个示例中进行编辑,但我不推荐它。
    猜你喜欢
    • 2017-01-25
    • 2017-08-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多