2010-02-22 95 views
0

在放棄一個醜陋的bash腳本後,我一直在學習如何在今天更好的部分使用Python。我試圖用2類來定義一些對象的數組來存儲一些獨特的字符串和整數(1-10)。對象將包括以下內容:Python實例沒有__call__方法

object[i].user 
     .n  # n = i 
     .name 
     .coords 
     .hero 

(參數1,參數2,參數3)將爲每個object.n和object.user不同,所以我嘗試使用不看的分配方法像寫完90個獨特的字符串之後的垃圾嵌套我發現沒有工作的例子,所以這裏的妥協:

class CityBean: 
    def __init__(self,name,coords,hero): 
     self.name = name 
     self.coords = coords 
     self.hero = hero 

class Castles: 
    def __init__(self,user,n): 
     self.user = user 
     self.n = n 
     if self.user == 'user1': 
      temp = { 
       1: CityBean("name1" , "coord1" , "hero1"), 
       ... blah blah blah 
       10: CityBean("name10" , "coord10" , "hero10")}[self.n]() 
     if self.user == 'user2': 
      temp = { 
       1: CityBean("name11" , "coord11" , "hero11"), 
       ... blah blah blah 
       10: CityBean("name20" , "coord20" , "hero20") }[self.n]() 
     if self.user == 'user3': 
      temp = { 
       1: CityBean("name21" , "coord21" , "hero21"), 
       ... blah blah blah 
       10: CityBean("name30" , "coord30" , "hero30") }[self.n]() 
     self.name = temp.name 
     self.coords = temp.coords 
     self.hero = temp.coords 
     __del__(temp) 

我是這樣叫它:

cities = list(Castles("user2",i) for i in range(1,11)) 

它給我這個錯誤:

AttributeError: CityBean instance has no __call__ method 

它歸咎於這條線:

   10: CityBean("name20" , "coord20" , "hero20") }[self.n]() # pseudo 
       10: CityBean("" , "" , "") }[self.n]() # what is actually looks like 

我的糟糕課程出了什麼問題?我正在做一些緩慢的事情,不是嗎?

+1

你有什麼打算實現與'[self.n]()'? – 2010-02-22 11:14:28

+0

我只是想挑選其中的一個選項,沒有意識到括號將結果稱爲函數......哎呀! – tyblu 2010-02-22 11:24:01

回答

6

真的很難從你提供的內容中猜出你想要什麼,因爲你沒有說你想做什麼,而是提供了新手代碼,所以人們猜測時間很長。

我覺得像這樣的事:

data = { 
     (1, 'user1'): ("name1", "coord1", "hero1"), 
     (2, 'user1'): ("name2", "coord2", "hero2"), 
     #... 
     (1, 'user2'): ("name11", "coord11", "hero11"), 
     (2, 'user2'): ("name12", "coord12", "hero12"), 
     # ... 
    } 


class CityBean: 
    def __init__(self,name,coords,hero): 
     self.name = name 
     self.coords = coords 
     self.hero = hero 

class Castles: 
    def __init__(self,user,n): 
     self.user = user 
     self.n = n 
     name, coords, hero = data.get((n, user)) 
     self.citybean = CityBean(name, coords, hero) 
+10

+1在你理解這個問題中代碼目標的能力之前,我鞠躬盡+1。 – 2010-02-22 11:20:30

+0

嘿,那看起來真好!謝謝nosklo。 – tyblu 2010-02-22 11:22:46

+1

@tyblu注意使用元組(1,'user1')作爲字典的關鍵字。元組是不可變的,因此可以用作關鍵字。列表[1,'user1']不能用作關鍵字。 – extraneon 2010-02-22 12:17:09

1

我真的不明白你到底該怎麼做,但:

10: CityBean("name10" , "coord10" , "hero10")}[self.n]() 

如果調用的東西(在最後的()使它成爲一個函數調用)。

什麼你想是我認爲 TEMP = {... 10:CityBean( 「name10」, 「coord10」, 「hero10」)} [self.n]

在這種情況下,你」 d用鍵n獲得字典輸入並標記該溫度。

+0

是的,那是我的快速修復 - 謝謝! – tyblu 2010-02-22 11:26:43

0

將parens放在普通表達式中的類名後立即進行實例化。如果你想拖延的實例化,那麼你就需要使用lambdafunctools.partial()

10: lambda: CityBean("", "", "")}... 
4

爲什麼你寫的嗎?

temp = { 
      1: CityBean("name21" , "coord21" , "hero21"), 
      ... blah blah blah 
      10: CityBean("name30" , "coord30" , "hero30") }[self.n]() 

您認爲temp= {...}[something]()會做什麼?

  1. 它創建一個字典。 {...}

  2. 它從字典中挑選出一個項目。 {...}[something]。這將是一個CityBean對象。

  3. 它評估一個項目作爲一個功能{...}[something]()CityBean(...)()

你爲什麼調用CityBean對象,如果它是一個功能?

此外,你爲什麼要創建整個字典只選擇它的一個項目? if陳述有什麼問題?

2

你正在做

{ 
1: CityBean("name1" , "coord1" , "hero1"), 
... blah blah blah 
10: CityBean("name10" , "coord10" , "hero10")}[self.n]() 

基本上是基於密鑰的字典獲取價值,你的字典值CityBean情況,因此,在短期,你這樣做是

CityBean("name1" , "coord1" , "hero1")() 

這是有效但會調用該實例的特殊方法__call__,因此要麼刪除(),要麼根據需要添加__call__方法

1

注意,在蟒蛇,當你寫

CityBean("name1" , "coord1" , "hero1") 

您初始化對象CityBean。不需要額外的()

0

,如果你做錯了什麼你可以得到這個問題

os.environ("METAG_DATA") 

正確的方法是

os.environ["METAG_DATA"]