2013-02-07 55 views
0

在Python中(我在這裏說2,但也有興趣知道約3)是否有一種方法可以預先定義所有需要的實例變量(成員字段)的列表,例如,使其成爲一個錯誤使用一個你還沒有定義的地方?在Python中,你能提前聲明所有可用的實例變量嗎?

喜歡的東西

class MyClass(object): 
    var somefield 
    def __init__ (self): 
     self.somefield = 4 
     self.banana = 25  # error! 

有點像您在Java,C++,PHP,做等

編輯:

我想這種事情的原因是早期發現使用最初尚未設置的變量。看來,一個棉絨實際上會挑這些錯誤,沒有任何額外的管道,所以也許我的問題是沒有意義的...

+0

你爲什麼要這個? – Dhara

+0

你爲什麼想要做這樣的事情? –

+0

@mattwritescode,Dhara:在某些情況下使用'__slots__'可以使代碼更快。除此之外,它可以強制執行某些OOP操作。看到[這裏](http://stackoverflow.com/questions/472000/python-slots) –

回答

4

爲什麼是的,你可以。

class MyClass(object): 
    __slots__ = ['somefield'] 
    def __init__ (self): 
     self.somefield = 4 
     self.banana = 25  # error! 

mind the caveats

+0

同時回答! :) - 但你的代碼:(。我想我會刪除我的...然後... – mgilson

+0

使用__slots__凍結類不是一個好主意 – Dhara

+0

並且介意'__slots__'主要是一個節省內存的工具 –

0

您可以使用上面貼了答案,但對於更多的「Python化」的做法,嘗試(鏈接到code.activestate.com)

以供將來參考列出的方法,直到我可以計算出如何鏈接到網站,這裏是代碼:

def frozen(set): 
    """Raise an error when trying to set an undeclared name, or when calling 
     from a method other than Frozen.__init__ or the __init__ method of 
     a class derived from Frozen""" 
    def set_attr(self,name,value): 
     import sys 
     if hasattr(self,name):         #If attribute already exists, simply set it 
      set(self,name,value) 
      return 
     elif sys._getframe(1).f_code.co_name is '__init__':  #Allow __setattr__ calls in __init__ calls of proper object types 
      for k,v in sys._getframe(1).f_locals.items(): 
       if k=="self" and isinstance(v, self.__class__): 
        set(self,name,value) 
        return 
     raise AttributeError("You cannot add attributes to %s" % self) 
    return set_attr 
+0

這很聰明。但正如Martijn Pieters指出的那樣,似乎pylint實際上挑選了我試圖阻止的那種錯誤,而沒有任何額外的管道。所以也許我的問題是多餘的... – Seb