2014-03-31 86 views
3

讓A類的對象a具有屬性「.my_tuple」。 我希望能夠獲得此屬性調用。這是一種乾淨的方式來實現一種「__tuple__」方法?

tuple(a) 

的simplier辦法,我發現是定義,如:

class A(): 
    # other things 
    def __iter__(self): 
     return self.my_tuple.__iter__() 

但似乎有點髒:我的理解是,「元組(一)」將遍歷self.my_tuple爲了構建它的副本,而我只需要一個指針...是內置的「元組」優化來處理這些情況?如果不是,這是否是一個最好的方式來做到這一點(保持「pythonic」:在我的情況下,將A型轉換爲元組是有意義的)。

+2

如果你真的想要一個指針或Pythonic舌頭中的引用,爲什麼不直接調用'a.my_tuple'。元組本身是不可變的,我認爲 –

+0

這種情況並不完全是我所描述的:我有幾個屬性,例如a.b,a.c,a。d和我想能夠做元組(a)來獲得(b,c,d)。我可以添加一個名爲a.tuple()的工作人員,但它對我來說看起來並不pythonic。 – Sebastien

+0

不清楚你在問什麼。你的問題聽起來像你有一個屬性已經是一個元組,你確實想創建一個不必要的元組副本。現在你說你想讓元組保存幾個(全部?)該類的屬性的內容。請澄清。 –

回答

3

內置的tuple()不是作爲您的類的定製點而設計的。據我所知,沒有用於轉換爲元組的定製點。

因此,您已經使用了一個設計的定製點,iter()內置和相應的__iter__方法。這很好,只要它去,但它確實均不超過您想要的:

  • 更多,因爲它允許任何人遍歷你的對象,而不僅僅是tuple()
  • 減少因爲儘管tuple檢測到它的參數是一個元組的情況下,它不檢測它從__iter__返回元組迭代器的情況。正如你所看到的,它複製了元組。

因爲沒有辦法直接通過自定義你的對象tuple()(不像iter()len()或其他許多人)的效果,你基本上不能使用tuple()功能訪問self.my_tuple的方式。你所能做的就是讓它返回一份副本。

基於您的評論:

我有例如AB,AC,AD幾個屬性,我想 能夠做到元組(一)獲得(B,C,d)

也許你可以利用collections.namedtuple

class A(collections.namedtuple('A', 'b c d')): 
    # whatever methods you need 

當然,這意味着A這些屬性是不可改變的,所以我如果這不是你想要的,那麼這沒有幫助。

1

從你的問題提出的各種意見,我建議允許獲得從一個對象的屬性的元組:

>>> class Tupleable(object): 
    def __iter__(self): 
     return (v for v in self.__dict__.itervalues()) 

>>> class A(Tupleable): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

>>> a = A(2, 'e') 
>>> tuple(a) 
(2, 'e') 

所有屬性中顯示,因此,如果您想要排除某些屬性,這是不是好的方向,但這可能適合你的需求。

相關問題