Экземпляр Python не имеет метода __call__ - PullRequest
0 голосов
/ 22 февраля 2010

Я изучал, как использовать Python для лучшей части сегодняшнего дня после отказа от уродливого скрипта bash.

Я пытаюсь использовать 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

Что не так с моими грубыми классами? Я делаю что-то отсталое, не так ли?

Ответы [ 7 ]

6 голосов
/ 22 февраля 2010

Трудно угадать, что вы хотите, исходя из того, что вы предоставили, поскольку вместо того, чтобы сказать, что вы хотите сделать, вы предоставили свой код новичка, так что у вас есть трудное время угадывания.

Я думаю, что-то вроде этого подойдет:

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)
4 голосов
/ 22 февраля 2010

Почему вы это написали?

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

Как вы думаете, temp= {...}[something]() сделает?

  1. Создает словарь. {...}

  2. Выбирает один элемент из словаря. {...}[something]. Это будет CityBean объект.

  3. Он оценивает этот элемент как функцию {...}[something]() Is CityBean(...)()

Почему вы вызываете объект CityBean, как если бы он был функцией?

Кроме того, почему вы создаете целые словари, чтобы выбрать только один из них? Что не так с if утверждениями?

2 голосов
/ 22 февраля 2010

вы делаете

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

, который в основном получен из значения dict на основе ключа, значения в вашем dict являются экземплярами CityBean, так что вкратце вы делаете это

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

, который действителен, но вызовет специальный метод __call__ экземпляра, поэтому либо удалите (), либо добавьте метод __call__ в зависимости от необходимости

1 голос
/ 28 октября 2016

Вы можете получить эту проблему, если сделаете что-то не так

os.environ("METAG_DATA")

Правильный путь

os.environ["METAG_DATA"]
1 голос
/ 22 февраля 2010

Обратите внимание, что в python, когда вы пишете

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

Вы инициализируете объект CityBean. Нет необходимости в дополнительных ().

1 голос
/ 22 февраля 2010

Я не совсем понимаю, что именно вы пытаетесь сделать, но:

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

если вызывать что-то (() в конце делает это вызовом функции).

То, что вы хотели бы, я думаю, temp = {... 10: CityBean ("name10", "ordin10 "," hero10 ")} [self.n]

В этом случае вы получите запись dict с ключом n и пометите эту температуру.

0 голосов
/ 22 февраля 2010

Помещение скобок после имени класса в нормальном выражении создает его немедленно. Если вы хотите отложить создание экземпляра, вам нужно использовать lambda или functools.partial():

10: lambda: CityBean("", "", "")}...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...