2010-02-22 93 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"]