Python-Instanz hat keine __call__ - Methode
Habe ich gelernt, wie man Python für die bessere Teil von heute, nachdem er bis auf einen hässlichen bash-Skript.
Ich versuche, die 2 Klassen zu definieren, die ein paar von arrays von Objekten, in denen zu speichern, einige einzigartige strings und zahlen (1-10). Die Objekte bestehen aus den folgenden:
object[i].user
.n # n = i
.name
.coords
.hero
(param1, param2, param3) wird anders sein für jedes Objekt.n und Objekt.Nutzer, so dass ich versuche, eine Zuweisung, die nicht Aussehen wie Müll, nachdem er 90 einzigartige Zeichenfolgen. Verschachtelung ein Beispiel habe ich gefunden, hat nicht funktioniert, hier also der Kompromiss:
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)
Ich nenne es mit so etwas wie dies:
cities = list( Castles("user2",i) for i in range(1,11) )
Es gibt mir diese Fehlermeldung:
AttributeError: CityBean instance has no __call__ method
Und es macht diese Zeile:
10: CityBean( "name20" , "coord20" , "hero20" ) }[self.n]() # pseudo
10: CityBean( "" , "" , "" ) }[self.n]() # what is actually looks like
Was ist Los mit meinem cruddy Klassen? Bin ich etwas zurückgeblieben, nicht wahr?
- Was wollen Sie erreichen mit
[self.n]()
? - Ich habe nur versucht, wählen Sie eine der Optionen, nicht ahnend, dass die Klammern bezeichnet das Ergebnis als Funktion... oops!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wirklich schwer zu erraten, was Sie wollen, was Sie zur Verfügung gestellt, denn, anstatt zu sagen, was Sie wollen, sofern Sie Ihre newbie-code, so hat man eine Festplatte denke, die Zeit.
Ich würde denken, etwas wie dies tun würde:
Warum habt Ihr dieses schreiben?
Was denkst du
temp= {...}[something]()
tun?Schafft es ein Wörterbuch.
{...}
Es wählt ein Element aus dem dictionary.
{...}[something]
. Dies wird eineCityBean
Objekt.Wertet er, dass ein Element als eine Funktion
{...}[something]()
IstCityBean(...)()
Warum fordern Sie die CityBean Objekt, als wenn es wurde eine Funktion?
Weiter, warum erstellen Sie komplette Wörterbücher nur um einen einzigen Punkt davon? Was ist falsch mit
if
Aussagen?Ihrem tun
welcher im wesentlichen aus einem dict get-Wert basiert auf Schlüssel, Werte auf Ihre dict sind CityBean Instanzen, so kurz Sie sind, dies zu tun
gültig ist, aber dann rufen wir die spezielle Methode
__call__
von der Instanz, also entweder entfernen()
oder fügen Sie ein__call__
Methode, je nach BedarfIch nicht wirklich verstehen, was Sie zu tun versuchen genau das, aber:
wenn etwas rufen (die () am Ende machen es zu einem Funktionsaufruf).
Was würden Sie wollen, ist, denke ich
temp = { ...
10: CityBean( "name10" , "coord10" , "hero10" )}[self.n]
In diesem Fall würden Sie bekommen das dict-Eintrag mit-Taste n und-Aufkleber, die temp.
Beachten Sie, dass in python, wenn Sie schreiben
Initialisieren Sie das Objekt
CityBean
. Es gibt keine Notwendigkeit für eine zusätzliche()
.Können Sie dieses problem, wenn Sie etwas falsch machen
Dem richtigen Weg ist
Setzen Klammern nach dem name einer Klasse in einem normalen Ausdruck instanziiert es sofort. Wenn Sie möchten, zu verzögern, Instanziierung, dann müssen Sie mit
lambda
oderfunctools.partial()
: