Python实例没有__call__方法

时间:2010-02-22 11:08:25

标签: python class instance

在放弃丑陋的bash脚本后,我一直在学习如何在今天的大部分时间里使用Python。

我正在尝试使用2个类来定义一些对象数组,用于存储一些唯一的字符串和整数(1-10)。对象将包含以下内容:

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

(param1,param2,param3)对于每个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

我的邋classes班有什么问题?我正在做一些迟钝的事,不是吗?

7 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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(...)()

  4. 为什么要将CityBean对象调用为函数?

    此外,为什么要创建整个词典只选择一个项目? if语句有什么问题?

答案 2 :(得分:2)

你正在做什么

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

这基本上来自基于键的dict get值,你的dict上的值是CityBean实例,所以总之你就是这样做

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

有效但会调用实例的特殊方法__call__,因此请根据需要删除()或添加__call__方法

答案 3 :(得分:1)

我真的不明白你要做的是什么,但是:

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

如果调用某事(最后的()使其成为函数调用。

我想你想要的是什么     temp = {...         10:CityBean(“name10”,“coord10”,“hero10”)} [self.n]

在这种情况下,您将获得带有键n的dict条目并标记为temp。

答案 4 :(得分:1)

注意,在python中,当你写

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

您初始化对象CityBean。无需额外()

答案 5 :(得分:1)

如果你做错了,你可以解决这个问题

os.environ("METAG_DATA")

正确的方法是

os.environ["METAG_DATA"]

答案 6 :(得分:0)

将普通表达式中的类名后面的parens立即实例化。如果您想延迟实例化,那么您需要使用lambdafunctools.partial()

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