簡體   English   中英

通過使容器可迭代來解壓縮實例變量

[英]Unpacking instance variables by making container iterable

我只想能夠解壓縮foo類的實例變量,例如:

x = foo("name", "999", "24", "0.222")
a, b, c, d = *x
a, b, c, d = [*x]

我不確定在實現自己的__iter__方法時哪種方法正確,但是,后者是處理混合“成功”方法的方法。 我之所以說是混合的,是因為對所提供的代碼執行此操作似乎會更改原始實例對象x ,從而使其不再有效。

class foo:
  def __init__(self, a, b, c, d):
    self.a = a
    self.b = b
    self.c = c
    self.d = d

  def __iter__(self):
    return iter([a, b, c, d])

我已經閱讀了本網站上有關__iter____next__ ,生成器等的大量文章,以及一本python書和docs.python.org,似乎無法弄清我的理解。 我已經收集到__iter__需要返回一個可迭代的對象(它可以只是self ,但是我不確定這對於我想要的是如何工作的)。 我還嘗試了各種實現__next__並遍歷vars(foo).items() ,這些方法通過轉換為列表或作為字典都沒有成功。

我不認為這是重復的帖子,因為我所看到的唯一類似的問題是呈現單個列表序列對象屬性或采用一定范圍的數字而不是四個非容器變量。

如果需要實例的變量,則應使用.self訪問:

def __iter__(self):
    return iter([self.a, self.b, self.c, self.d])

有了這個改變,

a, b, c, d = list(x)

會給你變量。


您可以使用使用vars(x)x.__dict__風險更高的方法,按變量名稱對其進行排序(這就是為什么它也是一個有限的變量,變量以無序保存的原因),然后提取第二個變量每個元組的元素。 但是我會說迭代器肯定更好。

您可以將參數存儲在屬性中(下面的self.e )或在函數調用時將其返回:

class foo:
  def __init__(self, *args):
    self.a, self.b, self.c, self.d = self.e = args

  def __call__(self):
    return self.e

x = foo("name", "999", "24", "0.222")
a, b, c, d = x.e
# or
a, b, c, d = x()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM