【问题标题】:Self vs return in Python Classes for Class Attribute类属性的 Python 类中的自我与返回
【发布时间】:2020-10-04 09:08:56
【问题描述】:

假设我有一个列表形式的类属性,以及该类中的两个函数,它们将数据附加到列表中,以便对列表进行进一步的操作。

这是否是一个正确的写法:

class Sample:
    def __init__(self):
        self.Mylist = []
        self.customfunc1()
        self.customfunc2()
        self.customfunc3()

    def customfunc1(self):
        somevar = 1
        self.Mylist.append(somevar)
    
    def customfunc2(self):
        somevar = 2
        self.Mylist.append(somevar)

    def customFunc3(self):
        ## Operations on self.Mylist

或者我是否需要在每个子函数之后返回一个值。我是使用“自我”参考的新手,所以任何帮助表示赞赏。

【问题讨论】:

  • 它只是彼此无关,self是对类的引用,所以如果你希望在使用你的funcs后用户会得到修改后的列表,你可以返回它。如果没有 - 不要。大多数时候在编写set 函数时通常不会返回修改后的成员
  • @YossiLevi 所以在我上面展示的例子中,这样写还可以吗?
  • 我认为我会这样做,当用户为内部成员设置值时,他通常不希望将其取回

标签: python oop self


【解决方案1】:

这一切都取决于意图。例如,当您查看标准库 (list.append) 时,约定是当方法改变其参数时,它不会返回任何内容(即它隐式返回 None)。这样做的目的是让数据被更改非常明显。

另一方面,如果数据没有改变,但您创建了一个新实例,那么,您实际上没有任何其他选项可以返回新实例。

对于你的例子,这有点难说,因为它有点人为,但由于 MyList 是类的内部实现细节,我绝对不会返回(或值)。

PS:在您的示例中,只有“实例变量”,而不是“类属性[s]” - 因为字段必须在上面声明一个范围。

【讨论】:

  • 是的,我的错,我的意思是mylist是一个变量,其中数据通过init方法下面的函数插入,然后在第三个子函数中使用。我写它的方式,包括不返回但按原样使用 self。只是想知道我是否不需要变量而不是只返回我可以像上面所做的那样传递它吗?
  • "class variable" 在您的示例中意味着数据是全局的,这可能不是您想要的。无论如何,我不会返回任何东西,因为它会改变给定的实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多