2013-04-22 19 views
4

問候。
我搜索了很長時間,發現許多相關的問題,但對我沒有答案。儘管我似乎是一個簡單的初學者懷疑。如何不把自己。什麼時候初始化Python類中的每個屬性?

我們有一個(我猜),典型的類定義:

class Town: 
    def __init__(self, Name, Ruler = "Spanish Inquisition"): 
     self.Name = Name 
     self.Population = 0 
     self.LocationX = 0 
     self.LocationY = 0 
     self.Religion = "Jedi" 
     self.Ruler = Ruler 
     self.Products = ["Redstone", "Azaleas"] 

你的想法。很多屬性。我需要所有這些。

的問題是:**有沒有快捷方式保存所有這些**我是不是太懶惰「的自我。」?我希望這樣的事情:

with self: 
    Name = Name 
    Population = 0 
    ... 

這當然我知道不工作(這不是使用「與」和參數是在一個錯誤的命名空間......我明白了吧?)。

我想有很多的替代品來達到同樣的結果,但我真的很好奇Python類的力量,我想其他人問起這個沒有成功。

(一個相關的問題:Most "pythonic" way of organising class attributes, constructor arguments and subclass constructor defaults?

+1

如果您碰到這個問題很多,我會建議看看您的文本編輯器是否允許您創建宏。每行輸入一個屬性名稱(因此,一行只顯示'name'),然後在行上運行宏以將'name'更改爲'self.name = name'。另外,您應該嘗試養成使用正確命名規則的習慣。所有這些參數和屬性[應該是小寫的](http://www.python.org/dev/peps/pep-0008/)。 – 2013-04-22 21:32:00

+1

爲'只輸入'self''添加一票。 – katrielalex 2013-04-22 21:33:46

回答

4

簡短的回答:不,你不能。在Python中訪問實例成員(屬性,方法)時,必須使用self

甲澄清:self不是在Python關鍵字。原則上你可以給方法的第一個參數任何名字,但是慣例要求你應該叫它self

+0

@ sr2222我糾正它,謝謝 – 2013-04-22 21:14:44

+1

它不需要被稱爲'self'雖然'this'或's'會做同樣的工作.. – Aprillion 2013-04-22 21:14:55

+0

O_O有多快。 - 那麼好吧:永遠是自我。謝謝! – 2013-04-22 21:15:16

4

你不會讓任何朋友,只有一種解釋....:

class Town2: 
    def __init__(self, name, ruler = 'Spider Pig'): 
     self.__dict__.update(dict(
      Name = name, 
      Population = 0, 
      LocationX = 0, 
      LocationY = 0, 
      Religion = "Jedi", 
      Ruler = ruler, 
      Products = ["Redstone", "Azaleas"])) 
+4

寶貝耶穌,他在哭泣。此外,這將使大多數嘗試使用屬性或其他描述符。 – 2013-04-22 21:19:24

+0

[淘氣](http://www.thefreedictionary.com/naughty) – 2013-04-22 21:20:04

+0

標尺應該是荷馬。蜘蛛豬! – CppLearner 2013-04-22 21:20:54

2

這裏是你能避免一個方式,所有的過度self,打字,合拍保持幹:

class Town(object): 
    def __init__(self, name, data={}): 
     setattr(self, 'name', name) 
     for k,v in data.iteritems(): 
      setattr(self, k, v) 


default_town_info = { 
    'population': 0, 
    'location_x': 0, 
    'location_y': 0 
    } 

a = Town('foo', default_town_info) 
print a.name 
print a.population 
print a.location_x 

這仍然將允許您訪問您的屬性,返回:

foo 
0 
0 

所以,是的,療法e是2個自我使用,但如果您始終通過確保提供所需屬性的字典(例如'name'),則可以減少它。

+0

這就是字典的力量,而不僅僅是階級的力量。我會試一試。也謝謝你! – 2013-04-22 22:52:48